Coverity fixes - DWARF (#3807)

* Fix 'CID 416720:  Memory - corruptions  (USE_AFTER_FREE)'

* Fix 'CID 416725:  Memory - corruptions  (OVERLAPPING_COPY)'

* Fix 'CID 416730:  Memory - illegal accesses  (USE_AFTER_FREE)'

* Fix 'CID 416731 Resource leak'
This commit is contained in:
billow
2023-08-30 10:10:33 +08:00
committed by GitHub
parent df024bc7fd
commit c936299fcc
6 changed files with 53 additions and 29 deletions
+7 -4
View File
@@ -393,22 +393,25 @@ RZ_API RZ_BORROW RzAnalysisVar *rz_analysis_function_set_var(
return var;
}
static RzAnalysisVar *var_clean(RzAnalysisVar *var) {
static bool var_clean(RzAnalysisVar *var) {
void **it;
RzPVector *removed = rz_pvector_new((RzPVectorFree)rz_analysis_var_delete);
rz_pvector_foreach (&var->fcn->vars, it) {
RzAnalysisVar *p = *it;
if (p->origin.kind == var->origin.kind) {
if (RZ_STR_EQ(p->name, var->name) && rz_analysis_var_storage_equals(&p->storage, &var->storage)) {
rz_analysis_var_free(var);
return NULL;
goto beach;
}
} else if (RZ_STR_EQ(p->name, var->name) || rz_analysis_var_storage_equals(&p->storage, &var->storage)) {
rz_pvector_push(removed, p);
}
}
rz_pvector_free(removed);
return var;
return true;
beach:
rz_analysis_var_free(var);
rz_pvector_free(removed);
return false;
}
/**
+1
View File
@@ -115,6 +115,7 @@ RZ_IPI bool Value_ne(RzBinDwarfValue *self, RzBinDwarfValue *rhs, ut64 addr_mask
RZ_IPI void Value_fini(RzBinDwarfValue *self);
RZ_IPI void Value_free(RzBinDwarfValue *self);
RZ_IPI RzBinDwarfValue *Value_clone(RzBinDwarfValue *self);
RZ_IPI bool Value_clone_into(RzBinDwarfValue *self, RzBinDwarfValue *val);
RZ_IPI void Value_dump(
RZ_BORROW RZ_NONNULL const RzBinDwarfEncoding *encoding,
RZ_BORROW RZ_NULLABLE DWARF_RegisterMapping dwarf_register_mapping,
+9 -6
View File
@@ -238,8 +238,9 @@ static void RzBinDwarfLocList_free(RzBinDwarfLocList *self) {
free(self);
}
static bool RzBinDwarfLocList_parse(RzBinDwarfLocListTable *self,
RzBuffer *buffer, RzBinDwarfEncoding *encoding, RzBinDwarfLocListsFormat format) {
static bool RzBinDwarfLocList_parse(
RzBinDwarfLocListTable *self, RzBuffer *buffer,
RzBinDwarfEncoding *encoding, RzBinDwarfLocListsFormat format) {
rz_return_val_if_fail(self && buffer && encoding, false);
RzBinDwarfLocList *loclist = RZ_NEW0(RzBinDwarfLocList);
RET_FALSE_IF_FAIL(loclist);
@@ -256,11 +257,13 @@ static bool RzBinDwarfLocList_parse(RzBinDwarfLocListTable *self,
break;
}
if (!RzBinDwarfLocListTable_convert_raw(self, raw_entry, &entry)) {
RzBinDwarfLocationListEntry_free(entry);
}
if (entry) {
if (RzBinDwarfLocListTable_convert_raw(self, raw_entry, &entry)) {
if (!entry) {
continue;
}
ERR_IF_FAIL(rz_pvector_push(&loclist->entries, entry));
} else {
RzBinDwarfLocationListEntry_free(entry);
}
continue;
err:
+11
View File
@@ -68,6 +68,17 @@
default: RZ_LOG_ERROR("DWARF: Unexpected pointer size: %u\n", (unsigned)(X)); return false; \
}
#define READ_OR(bit, T, out, F, E) \
do { \
ut##bit temp = { 0 }; \
if (!F) { \
E; \
} \
(out) = (T)temp; \
} while (0)
#define READ_T_OR(bit, T, out, E) READ_OR(bit, T, out, rz_buf_read_ble##bit(buffer, &temp, big_endian), E)
#define U8_OR_RET_NULL(out) WRAP_U8(out, RET_NULL_IF_FAIL)
#define U_OR_RET_NULL(X, out) WRAP_U(X, out, RET_NULL_IF_FAIL)
#define UX_OR_RET_NULL(X, out) WRAP_UX(X, out, RET_NULL_IF_FAIL)
+5 -4
View File
@@ -800,11 +800,12 @@ static bool Evaluation_evaluate_one_operation(RzBinDwarfEvaluation *self, Operat
}
RzBinDwarfValue *value = rz_vector_index_ptr(&self->stack, len - operation.pick.index - 1);
ERR_IF_FAIL(value);
RzBinDwarfValue *clone = Value_clone(value);
if (!Evaluation_push(self, clone)) {
Value_free(clone);
RzBinDwarfValue clone = { 0 };
ERR_IF_FAIL(Value_clone_into(value, &clone));
if (!Evaluation_push(self, &clone)) {
Value_fini(&clone);
goto err;
}
free(clone);
break;
}
case OPERATION_KIND_SWAP: {
+20 -15
View File
@@ -138,29 +138,25 @@ RZ_IPI RzBinDwarfValue *Value_parse(RzBinDwarfValueType value_type, RzBuffer *bu
value->type = value_type;
switch (value_type) {
case RzBinDwarfValueType_I8:
U8_OR_RET_NULL(value->i8);
value->i8 = (st8)value->i8;
READ_OR(8, st8, value->i8, rz_buf_read8(buffer, &temp), return NULL);
break;
case RzBinDwarfValueType_U8:
U8_OR_RET_NULL(value->u8);
break;
case RzBinDwarfValueType_I16:
U_OR_RET_NULL(16, value->u16);
value->i16 = (st16)value->u16;
READ_T_OR(16, st16, value->i16, return NULL);
break;
case RzBinDwarfValueType_U16:
U_OR_RET_NULL(16, value->u16);
break;
case RzBinDwarfValueType_I32:
U_OR_RET_NULL(32, value->u32);
value->i32 = (st32)value->u32;
READ_T_OR(32, st32, value->i32, return NULL);
break;
case RzBinDwarfValueType_U32:
U_OR_RET_NULL(32, value->u32);
break;
case RzBinDwarfValueType_I64:
U_OR_RET_NULL(64, value->u64);
value->i64 = (st64)value->u64;
READ_T_OR(64, st64, value->i64, return NULL);
break;
case RzBinDwarfValueType_U64:
U_OR_RET_NULL(64, value->u64);
@@ -170,12 +166,10 @@ RZ_IPI RzBinDwarfValue *Value_parse(RzBinDwarfValueType value_type, RzBuffer *bu
RZ_LOG_ERROR("I128/U128 not supported\n")
return NULL;
case RzBinDwarfValueType_F32:
U8_OR_RET_NULL(value->u32);
value->f32 = (float)value->u32;
READ_T_OR(32, float, value->f32, return NULL);
break;
case RzBinDwarfValueType_F64:
U8_OR_RET_NULL(value->u64);
value->f64 = (float)value->u64;
READ_T_OR(64, double, value->f64, return NULL);
break;
default:
free(value);
@@ -1028,12 +1022,23 @@ RZ_IPI void Value_free(RzBinDwarfValue *self) {
}
RZ_IPI RzBinDwarfValue *Value_clone(RzBinDwarfValue *self) {
rz_warn_if_fail(self);
RzBinDwarfValue *val = RZ_NEWCOPY(RzBinDwarfValue, self);
rz_return_val_if_fail(self, NULL);
RzBinDwarfValue *val = RZ_NEW(RzBinDwarfValue);
RET_NULL_IF_FAIL(val);
if (!Value_clone_into(self, val)) {
Value_free(val);
return NULL;
}
return val;
}
RZ_IPI bool Value_clone_into(RzBinDwarfValue *self, RzBinDwarfValue *val) {
rz_return_val_if_fail(self && val, false);
rz_mem_copy(val, sizeof(RzBinDwarfValue), self, sizeof(RzBinDwarfValue));
if (val->type == RzBinDwarfValueType_LOCATION) {
val->location = rz_bin_dwarf_location_clone(self->location);
}
return val;
return true;
}
static const char *Value_strings[] = {