From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S941310AbcJXVIu (ORCPT ); Mon, 24 Oct 2016 17:08:50 -0400 Received: from mx1.redhat.com ([209.132.183.28]:34132 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752186AbcJXVIs (ORCPT ); Mon, 24 Oct 2016 17:08:48 -0400 Date: Mon, 24 Oct 2016 23:08:41 +0200 From: Jiri Olsa To: Philippe Proulx Cc: linux-kernel@vger.kernel.org, Wang Nan , =?iso-8859-1?Q?J=E9r=E9mie?= Galarneau , "David S . Miller" , Alexei Starovoitov , Brendan Gregg , Jiri Olsa , Masami Hiramatsu , Namhyung Kim , Zefan Li , pi3orama@163.com Subject: Re: [PATCH] perf data convert: fix possible leak Message-ID: <20161024210841.GA2382@krava> References: <20161024192306.18566-1-eeppeliteloop@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20161024192306.18566-1-eeppeliteloop@gmail.com> User-Agent: Mutt/1.7.1 (2016-10-04) X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Mon, 24 Oct 2016 21:08:48 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, Oct 24, 2016 at 03:23:06PM -0400, Philippe Proulx wrote: > This patch removes the need to manually update the static size of > data.array in struct ctf_writer. > > Signed-off-by: Philippe Proulx Acked-by: Jiri Olsa thanks, jirka > --- > tools/perf/util/data-convert-bt.c | 65 ++++++++++++++++++++------------------- > 1 file changed, 33 insertions(+), 32 deletions(-) > > diff --git a/tools/perf/util/data-convert-bt.c b/tools/perf/util/data-convert-bt.c > index 7123f4d..6c04ad6 100644 > --- a/tools/perf/util/data-convert-bt.c > +++ b/tools/perf/util/data-convert-bt.c > @@ -58,7 +58,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; > @@ -66,8 +66,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; > struct bt_ctf_event_class *comm_class; > struct bt_ctf_event_class *exit_class; > @@ -133,7 +134,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); \ > } > > @@ -150,7 +151,7 @@ static __maybe_unused int > value_set_string(struct ctf_writer *cw, struct bt_ctf_event *event, > const char *name, const char *string) > { > - struct bt_ctf_field_type *type = cw->data.string; > + struct bt_ctf_field_type *type = cw->data.fts.string; > struct bt_ctf_field *field; > int ret = 0; > > @@ -181,25 +182,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) > @@ -969,8 +970,8 @@ static int add_tracepoint_types(struct ctf_writer *cw, > static int add_bpf_output_types(struct ctf_writer *cw, > struct bt_ctf_event_class *class) > { > - struct bt_ctf_field_type *len_type = cw->data.u32; > - struct bt_ctf_field_type *seq_base_type = cw->data.u32_hex; > + struct bt_ctf_field_type *len_type = cw->data.fts.u32; > + struct bt_ctf_field_type *seq_base_type = cw->data.fts.u32_hex; > struct bt_ctf_field_type *seq_type; > int ret; > > @@ -1013,31 +1014,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_FIELD > return 0; > @@ -1109,7 +1110,7 @@ static int setup_events(struct ctf_writer *cw, struct perf_session *session) > #define __NON_SAMPLE_ADD_FIELD(t, n) \ > do { \ > pr2(" field '%s'\n", #n); \ > - if (bt_ctf_event_class_add_field(event_class, cw->data.t, #n)) {\ > + if (bt_ctf_event_class_add_field(event_class, cw->data.fts.t, #n)) {\ > pr_err("Failed to add field '%s';\n", #n);\ > return -1; \ > } \ > @@ -1324,15 +1325,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: > @@ -1406,7 +1407,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; > -- > 2.9.3 >