diff --git a/contrib/plugins/bap-tracing/frame_buffer.c b/contrib/plugins/bap-tracing/frame_buffer.c index bbfa0c313534d..67e40157f444b 100644 --- a/contrib/plugins/bap-tracing/frame_buffer.c +++ b/contrib/plugins/bap-tracing/frame_buffer.c @@ -257,10 +257,10 @@ OperandInfo *frame_init_reg_operand_info(const char *name, const uint8_t *value, return oi; } -static OperandInfo *frame_init_mem_operand_info(uint64_t vaddr, - const uint8_t *mval, - size_t mval_bits, - bool is_store) { +static OperandInfo *frame_init_mem_operand_info_take(uint64_t vaddr, + uint8_t *mval, + size_t mval_bits, + bool is_store) { MemOperand *ro = g_new(MemOperand, 1); mem_operand__init(ro); ro->address = vaddr; @@ -280,17 +280,20 @@ static OperandInfo *frame_init_mem_operand_info(uint64_t vaddr, oi->operand_info_specific = ois; oi->operand_usage = ou; oi->value.len = byte_width; - oi->value.data = g_malloc(oi->value.len); - memcpy(oi->value.data, mval, oi->value.len); + oi->value.data = mval; return oi; } -bool frame_buffer_append_mem_info(FrameBuffer *fbuf, uint64_t vaddr, - const uint8_t *mval, size_t mval_bits, - bool is_store) { +bool frame_buffer_append_mem_info_take(FrameBuffer *fbuf, uint64_t vaddr, + uint8_t *mval, size_t mval_bits, + bool is_store) { OperandInfo *oi = - frame_init_mem_operand_info(vaddr, mval, mval_bits, is_store); + frame_init_mem_operand_info_take(vaddr, mval, mval_bits, is_store); g_assert(oi); - return append_op_info(fbuf, oi); + if (!append_op_info(fbuf, oi)) { + free_operand(oi); + return false; + } + return true; } diff --git a/contrib/plugins/bap-tracing/frame_buffer.h b/contrib/plugins/bap-tracing/frame_buffer.h index f6126ce00dc26..682f54f287429 100644 --- a/contrib/plugins/bap-tracing/frame_buffer.h +++ b/contrib/plugins/bap-tracing/frame_buffer.h @@ -40,9 +40,14 @@ bool frame_buffer_new_frame_std(FrameBuffer *buf, unsigned int thread_id, uint64_t vaddr, const char *mode_id, uint8_t *bytes, size_t bytes_len); -bool frame_buffer_append_mem_info(FrameBuffer *fbuf, uint64_t vaddr, - const uint8_t *mval, size_t mval_bits, - bool is_store); +/** + * \brief Appends a memory operand to the open frame. + * + * Takes ownership of \p mval and frees it even if appending fails. + */ +bool frame_buffer_append_mem_info_take(FrameBuffer *fbuf, uint64_t vaddr, + uint8_t *mval, size_t mval_bits, + bool is_store); /** * \brief Appends the given operand info to the open frame. diff --git a/contrib/plugins/bap-tracing/tracing.c b/contrib/plugins/bap-tracing/tracing.c index dc7eaf7d53d52..d4d75c29d2558 100644 --- a/contrib/plugins/bap-tracing/tracing.c +++ b/contrib/plugins/bap-tracing/tracing.c @@ -79,7 +79,8 @@ static void add_mem_op(VCPU *vcpu, unsigned int vcpu_index, FrameBuffer *fbuf, size_t mval_bits = mval_type_to_int(mval->type); uint8_t *buf = g_malloc(mval_bits / 8); mval_to_buf(mval, buf); - if (!frame_buffer_append_mem_info(fbuf, vaddr, buf, mval_bits, is_store)) { + if (!frame_buffer_append_mem_info_take(fbuf, vaddr, buf, mval_bits, + is_store)) { qemu_plugin_outs("Failed to append memory info\n"); } return; @@ -107,7 +108,7 @@ static void log_insn_mem_access(unsigned int vcpu_index, static void add_post_reg_state(VCPU *vcpu, unsigned int vcpu_index, GArray *current_regs, FrameBuffer *fbuf) { - GByteArray *rdata = g_byte_array_new(); + g_autoptr(GByteArray) rdata = g_byte_array_new(); for (size_t i = 0; i < current_regs->len; ++i) { Register *prev_reg = vcpu->registers->pdata[i]; @@ -135,7 +136,7 @@ static void add_post_reg_state(VCPU *vcpu, unsigned int vcpu_index, static void add_pre_reg_state(VCPU *vcpu, unsigned int vcpu_index, GArray *current_regs, FrameBuffer *fbuf) { - GByteArray *rdata = g_byte_array_new(); + g_autoptr(GByteArray) rdata = g_byte_array_new(); for (size_t i = 0; i < current_regs->len; ++i) { qemu_plugin_reg_descriptor *reg = &g_array_index(current_regs, qemu_plugin_reg_descriptor, i); @@ -153,10 +154,9 @@ static void add_pre_reg_state(VCPU *vcpu, unsigned int vcpu_index, } static GPtrArray *registers_init(void) { - GArray *reg_list = qemu_plugin_get_registers(); + g_autoptr(GArray) reg_list = qemu_plugin_get_registers(); if (reg_list->len == 0) { - g_array_free(reg_list, false); return NULL; } GPtrArray *registers = g_ptr_array_new(); @@ -202,7 +202,7 @@ static void flush_all_frame_bufs(void) { FrameBuffer *fbuf = g_ptr_array_index(state.frame_buffer, i); VCPU *vcpu = g_ptr_array_index(state.vcpus, i); g_assert(vcpu); - GArray *current_regs = qemu_plugin_get_registers(); + g_autoptr(GArray) current_regs = qemu_plugin_get_registers(); g_assert(current_regs->len == vcpu->registers->len); add_post_reg_state(vcpu, i, current_regs, fbuf); frame_buffer_close_frame(fbuf); @@ -240,7 +240,7 @@ static void log_insn_reg_access(unsigned int vcpu_index, void *udata) { FrameBuffer *fbuf = g_ptr_array_index(state.frame_buffer, vcpu_index); VCPU *vcpu = g_ptr_array_index(state.vcpus, vcpu_index); g_assert(vcpu); - GArray *current_regs = qemu_plugin_get_registers(); + g_autoptr(GArray) current_regs = qemu_plugin_get_registers(); g_assert(current_regs->len == vcpu->registers->len); if (!frame_buffer_is_empty(fbuf)) {