lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Thu, 11 Feb 2016 17:46:57 -0500 From: Philippe Proulx <eeppeliteloop@...il.com> To: Peter Zijlstra <peterz@...radead.org>, Ingo Molnar <mingo@...hat.com>, Arnaldo Carvalho de Melo <acme@...nel.org> Cc: linux-kernel@...r.kernel.org Subject: [PATCH] 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 <eeppeliteloop@...il.com> --- tools/perf/util/data-convert-bt.c | 57 ++++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/tools/perf/util/data-convert-bt.c b/tools/perf/util/data-convert-bt.c index 34cd1e4..bf0ec1a 100644 --- a/tools/perf/util/data-convert-bt.c +++ b/tools/perf/util/data-convert-bt.c @@ -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_FIELD return 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; -- 2.7.0
Powered by blists - more mailing lists