mirror of
https://github.com/rizinorg/rizin.git
synced 2026-10-12 02:21:57 +00:00
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:
@@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
@@ -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[] = {
|
||||
|
||||
Reference in New Issue
Block a user