perf data convert: fix possible leak
PATCH 1/1 perf data convert: fix possible leak
This patch removes the need to manually update the static size of data.array in struct ctf_writer.
Signed-off-by Philippe Proulx <[email protected]>
--- tools/perf/util/data-convert-bt.c | 57 ++++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 28 deletions(-)
tools/perf/util/data-convert-bt.c +29 -28
@@ -57,7 +57,7 @@ struct ctf_writer {/* data types */ union { -struct { +struct field_types {struct bt_ctf_field_type *s64;struct bt_ctf_field_type *u64;struct bt_ctf_field_type *s32;
@@ -65,8 +65,9 @@ struct ctf_writer {struct bt_ctf_field_type *string;struct bt_ctf_field_type *u32_hex;struct bt_ctf_field_type *u64_hex; - }; -struct bt_ctf_field_type *array[6 ]; + } fts; +struct bt_ctf_field_type *array[sizeof (struct field_types ) / +sizeof (struct bt_ctf_field_type *)]; } data; };
@@ -128,7 +129,7 @@ static __maybe_unused int value_set_##_name(struct ctf_writer *cw, \ const char *name, \ _val_type val) \ { \ -struct bt_ctf_field_type *type = cw->data._name; \ +struct bt_ctf_field_type *type = cw->data.fts._name; \return value_set (type, event, name, (u64 ) val); \ }
@@ -146,25 +147,25 @@ get_tracepoint_field_type(struct ctf_writer *cw, struct format_field *field)unsigned long flags = field->flags;if (flags &FIELD_IS_STRING ) -return cw->data.string; +return cw->data.fts.string;if (!(flags &FIELD_IS_SIGNED )) {/* unsigned long are mostly pointers */ if (flags &FIELD_IS_LONG || flags &FIELD_IS_POINTER ) -return cw->data.u64_hex; +return cw->data.fts.u64_hex; }if (flags &FIELD_IS_SIGNED ) {if (field->size ==8 ) -return cw->data.s64; +return cw->data.fts.s64;else -return cw->data.s32; +return cw->data.fts.s32; }if (field->size ==8 ) -return cw->data.u64; +return cw->data.fts.u64;else -return cw->data.u32; +return cw->data.fts.u32; }static unsigned long long adjust_signedness (unsigned long long value_int,int size)
@@ -771,31 +772,31 @@ static int add_generic_types(struct ctf_writer *cw, struct perf_evsel *evsel, }while (0 )if (type &PERF_SAMPLE_IP ) -ADD_FIELD (event_class, cw->data.u64_hex,"perf_ip" ); +ADD_FIELD (event_class, cw->data.fts.u64_hex,"perf_ip" );if (type &PERF_SAMPLE_TID ) { -ADD_FIELD (event_class, cw->data.s32,"perf_tid" ); -ADD_FIELD (event_class, cw->data.s32,"perf_pid" ); +ADD_FIELD (event_class, cw->data.fts.s32,"perf_tid" ); +ADD_FIELD (event_class, cw->data.fts.s32,"perf_pid" ); }if ((type &PERF_SAMPLE_ID ) || (type &PERF_SAMPLE_IDENTIFIER )) -ADD_FIELD (event_class, cw->data.u64,"perf_id" ); +ADD_FIELD (event_class, cw->data.fts.u64,"perf_id" );if (type &PERF_SAMPLE_STREAM_ID ) -ADD_FIELD (event_class, cw->data.u64,"perf_stream_id" ); +ADD_FIELD (event_class, cw->data.fts.u64,"perf_stream_id" );if (type &PERF_SAMPLE_PERIOD ) -ADD_FIELD (event_class, cw->data.u64,"perf_period" ); +ADD_FIELD (event_class, cw->data.fts.u64,"perf_period" );if (type &PERF_SAMPLE_WEIGHT ) -ADD_FIELD (event_class, cw->data.u64,"perf_weight" ); +ADD_FIELD (event_class, cw->data.fts.u64,"perf_weight" );if (type &PERF_SAMPLE_DATA_SRC ) -ADD_FIELD (event_class, cw->data.u64,"perf_data_src" ); +ADD_FIELD (event_class, cw->data.fts.u64,"perf_data_src" );if (type &PERF_SAMPLE_TRANSACTION ) -ADD_FIELD (event_class, cw->data.u64,"perf_transaction" ); +ADD_FIELD (event_class, cw->data.fts.u64,"perf_transaction" );#undef ADD_FIELDreturn 0 ;
@@ -979,15 +980,15 @@ do { \ goto err; \ }while (0 ) -CREATE_INT_TYPE (cw->data.s64,64 , true, false); -CREATE_INT_TYPE (cw->data.u64,64 , false, false); -CREATE_INT_TYPE (cw->data.s32,32 , true, false); -CREATE_INT_TYPE (cw->data.u32,32 , false, false); -CREATE_INT_TYPE (cw->data.u32_hex,32 , false, true); -CREATE_INT_TYPE (cw->data.u64_hex,64 , false, true); +CREATE_INT_TYPE (cw->data.fts.s64,64 , true, false); +CREATE_INT_TYPE (cw->data.fts.u64,64 , false, false); +CREATE_INT_TYPE (cw->data.fts.s32,32 , true, false); +CREATE_INT_TYPE (cw->data.fts.u32,32 , false, false); +CREATE_INT_TYPE (cw->data.fts.u32_hex,32 , false, true); +CREATE_INT_TYPE (cw->data.fts.u64_hex,64 , false, true); - cw->data.string =bt_ctf_field_type_string_create (); -if (cw->data.string) + cw->data.fts.string =bt_ctf_field_type_string_create (); +if (cw->data.fts.string)return 0 ; err:
@@ -1061,7 +1062,7 @@ static int ctf_writer__init(struct ctf_writer *cw, const char *path)if (!pkt_ctx_type) goto err_cleanup; - ret =bt_ctf_field_type_structure_add_field (pkt_ctx_type, cw->data.u32,"cpu_id" ); + ret =bt_ctf_field_type_structure_add_field (pkt_ctx_type, cw->data.fts.u32,"cpu_id" );bt_ctf_field_type_put (pkt_ctx_type);if (ret) goto err_cleanup;
Signature · 1 line
2.7.0