From patchwork Thu Dec 19 21:48:06 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steven Rostedt X-Patchwork-Id: 11304441 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 0142413A4 for ; Thu, 19 Dec 2019 21:49:00 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id D3FD22467E for ; Thu, 19 Dec 2019 21:48:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726880AbfLSVs7 (ORCPT ); Thu, 19 Dec 2019 16:48:59 -0500 Received: from mail.kernel.org ([198.145.29.99]:36478 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726986AbfLSVs7 (ORCPT ); Thu, 19 Dec 2019 16:48:59 -0500 Received: from gandalf.local.home (cpe-66-24-58-225.stny.res.rr.com [66.24.58.225]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 2068224679 for ; Thu, 19 Dec 2019 21:48:59 +0000 (UTC) Received: from rostedt by gandalf.local.home with local (Exim 4.92.3) (envelope-from ) id 1ii3fG-000UqF-8f for linux-trace-devel@vger.kernel.org; Thu, 19 Dec 2019 16:48:58 -0500 Message-Id: <20191219214858.137902679@goodmis.org> User-Agent: quilt/0.65 Date: Thu, 19 Dec 2019 16:48:06 -0500 From: Steven Rostedt To: linux-trace-devel@vger.kernel.org Subject: [PATCH 1/2] trace-cmd: Duplicate trace_clock in tracecmd_input handle References: <20191219214805.821145530@goodmis.org> MIME-Version: 1.0 Sender: linux-trace-devel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-trace-devel@vger.kernel.org From: "Steven Rostedt (VMware)" The following crashes: # trace-cmd record -C local -e sched -B foo -e irq sleep 1 # trace-cmd report The issue is that new instances are copied from the top instance descriptor and their values are set. This means that the trace_clock field is also copied which is a pointer to a string. On freeing of the tracecmd_input handlers, the trace_clock is freed. This is an issue if the trace_clock was added as an option, because the instance just has a copy of the top instance, and when the instance descriptor is freed, it will free the same pointer that was already freed by the descruction of the top instance descriptor and we have a double free. Have the creation of the instance tracecmd_input handler descriptor perform a strdup() and have its own copy of the trace_clock. Signed-off-by: Steven Rostedt (VMware) --- lib/trace-cmd/trace-input.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/trace-cmd/trace-input.c b/lib/trace-cmd/trace-input.c index 3b187e3f135b..5688610fe082 100644 --- a/lib/trace-cmd/trace-input.c +++ b/lib/trace-cmd/trace-input.c @@ -3398,6 +3398,13 @@ tracecmd_buffer_instance_handle(struct tracecmd_input *handle, int indx) new_handle->nr_buffers = 0; new_handle->buffers = NULL; new_handle->ref = 1; + if (handle->trace_clock) { + new_handle->trace_clock = strdup(handle->trace_clock); + if (!new_handle->trace_clock) { + free(new_handle); + return NULL; + } + } new_handle->parent = handle; new_handle->cpustats = NULL; new_handle->hooks = NULL; From patchwork Thu Dec 19 21:48:07 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steven Rostedt X-Patchwork-Id: 11304443 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 3B3761593 for ; Thu, 19 Dec 2019 21:49:00 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 1990D2467B for ; Thu, 19 Dec 2019 21:49:00 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726986AbfLSVtA (ORCPT ); Thu, 19 Dec 2019 16:49:00 -0500 Received: from mail.kernel.org ([198.145.29.99]:36480 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727105AbfLSVs7 (ORCPT ); Thu, 19 Dec 2019 16:48:59 -0500 Received: from gandalf.local.home (cpe-66-24-58-225.stny.res.rr.com [66.24.58.225]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 46CE92467B for ; Thu, 19 Dec 2019 21:48:59 +0000 (UTC) Received: from rostedt by gandalf.local.home with local (Exim 4.92.3) (envelope-from ) id 1ii3fG-000Uqj-Dj for linux-trace-devel@vger.kernel.org; Thu, 19 Dec 2019 16:48:58 -0500 Message-Id: <20191219214858.297560793@goodmis.org> User-Agent: quilt/0.65 Date: Thu, 19 Dec 2019 16:48:07 -0500 From: Steven Rostedt To: linux-trace-devel@vger.kernel.org Subject: [PATCH 2/2] tools lib traceevent: Add builtin handler for trace_marker_raw References: <20191219214805.821145530@goodmis.org> MIME-Version: 1.0 Sender: linux-trace-devel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-trace-devel@vger.kernel.org From: "Steven Rostedt (VMware)" When something is written into trace_marker_raw, it goes in as a binary. But the printk_fmt() of the event that is created (raw_data)'s format file only prints the first byte of data: print fmt: "id:%04x %08x", REC->id, (int)REC->buf[0] This is no very useful if we want to see the full data output. Implement the processing of the raw_data event like it is in the kernel. Signed-off-by: Steven Rostedt (VMware) --- lib/traceevent/plugins/plugin_function.c | 41 ++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/lib/traceevent/plugins/plugin_function.c b/lib/traceevent/plugins/plugin_function.c index 80fdfc3aa2a9..938b7410776a 100644 --- a/lib/traceevent/plugins/plugin_function.c +++ b/lib/traceevent/plugins/plugin_function.c @@ -207,6 +207,44 @@ trace_stack_handler(struct trace_seq *s, struct tep_record *record, return 0; } +static int +trace_raw_data_handler(struct trace_seq *s, struct tep_record *record, + struct tep_event *event, void *context) +{ + struct tep_format_field *field; + unsigned long long id; + int long_size; + void *data = record->data; + + if (tep_get_field_val(s, event, "id", record, &id, 1)) + return trace_seq_putc(s, '!'); + + trace_seq_printf(s, "# %llx", id); + + field = tep_find_any_field(event, "buf"); + if (!field) { + trace_seq_printf(s, "", "buf"); + return 0; + } + + long_size = tep_get_long_size(event->tep); + + for (data += field->offset; data < record->data + record->size; + data += long_size) { + int size = sizeof(long); + int left = (record->data + record->size) - data; + int i; + + if (size > left) + size = left; + + for (i = 0; i < size; i++) + trace_seq_printf(s, " %02x", *(unsigned char *)(data + i)); + } + + return 0; +} + int TEP_PLUGIN_LOADER(struct tep_handle *tep) { tep_register_event_handler(tep, -1, "ftrace", "function", @@ -215,6 +253,9 @@ int TEP_PLUGIN_LOADER(struct tep_handle *tep) tep_register_event_handler(tep, -1, "ftrace", "kernel_stack", trace_stack_handler, NULL); + tep_register_event_handler(tep, -1, "ftrace", "raw_data", + trace_raw_data_handler, NULL); + tep_plugin_add_options("ftrace", plugin_options); return 0;