From patchwork Wed Mar 25 14:08:27 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Tzvetomir Stoyanov (VMware)" X-Patchwork-Id: 11457933 X-Patchwork-Delegate: rostedt@goodmis.org 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 C54AC913 for ; Wed, 25 Mar 2020 14:08:35 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id A53E32077D for ; Wed, 25 Mar 2020 14:08:35 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="LeHMVkmt" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727570AbgCYOIf (ORCPT ); Wed, 25 Mar 2020 10:08:35 -0400 Received: from mail-lf1-f65.google.com ([209.85.167.65]:41688 "EHLO mail-lf1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727674AbgCYOIf (ORCPT ); Wed, 25 Mar 2020 10:08:35 -0400 Received: by mail-lf1-f65.google.com with SMTP id z23so1880581lfh.8 for ; Wed, 25 Mar 2020 07:08:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=SaRLco7nhJ/8U9CxMnyv9fdYM2DGUMOWhs0LicHLMYM=; b=LeHMVkmt3jKYBb5yXb/nKKeBQ+8r9I+3d/wmybRRDwZReic+jP07bnLnYQsVa7UiDx pJ44kkrbG5B7PMZd0IfP2Ud6OzVYqcGqEVrDjrsz757wQkhBgInVA01cyLMAlFy7v+mP xI++/dfz2kSLBqN9zHZZTgBNbpbaAFjfJzixWmPuIr+QMgyOVfIUrjoPottdWHraAfzF +6aovcanI8qH3vhXJMplYdm8Fq8jSGqbTC8ve7PGy36TnMQlaESvefOmL63FP4sXsMes sr+aYRwgIScx8MBw3Wrb71jTFQCwS4MSG4H+J1jeZorEe0BQ5vUcUcAEyRbkHWNbYyDK BZcQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=SaRLco7nhJ/8U9CxMnyv9fdYM2DGUMOWhs0LicHLMYM=; b=uKReFiWu7q3WIvsYgWS312yl+T3iLsckLiDvG0mQotIdyJH4sUcJT0rLNoeegX1Bs9 LPVMnIXuibmD2FX3Bp1GrycOwDvRQeu85kds2mmikSHDLLKK2zgXZjyvUuJpXDO+HUfa 7s9QPTIh5nopTlagYQP0/fr3zc4WKlUoRS50lBb5Z2jN/c4NrYuYKRcm1paWZAy/q9tg +GW/8/rJl7UmTMvBOhjVfN0I1Q7jNKVCJZUM6eD9Uh0YhHmyEVvnS7RNlVFOifjnfQoI g2gWGTSV4gdoi8Z1b68L8EgWh3U0vtxQutjUtfHiukVV3FXSKAqbN7QPDg5Rwq2W+HXv E2CA== X-Gm-Message-State: ANhLgQ2lGsieIMuthXUBjl1/p2qZOwGt01VWoIttdFHJsgru0bda2M3u 89J2kKyrLnFwNPPsNU2RyVU= X-Google-Smtp-Source: ADFU+vuUaPLsIKSs1ARPyLTK4DhAr2eIGtOd9bL/7ZW/RXLb7rJOTY1+NYuBGmDZeTc8E2ST0A7JZw== X-Received: by 2002:a19:5019:: with SMTP id e25mr2505602lfb.68.1585145313525; Wed, 25 Mar 2020 07:08:33 -0700 (PDT) Received: from oberon.zico.biz ([83.222.187.186]) by smtp.gmail.com with ESMTPSA id v9sm12017301ljv.82.2020.03.25.07.08.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 25 Mar 2020 07:08:33 -0700 (PDT) From: "Tzvetomir Stoyanov (VMware)" To: rostedt@goodmis.org Cc: linux-trace-devel@vger.kernel.org Subject: [PATCH 1/3] trace-cmd: Fix check for trigger file in create_event() Date: Wed, 25 Mar 2020 16:08:27 +0200 Message-Id: <20200325140829.184651-2-tz.stoyanov@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200325140829.184651-1-tz.stoyanov@gmail.com> References: <20200325140829.184651-1-tz.stoyanov@gmail.com> 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 When a trigger is configured on an event with trace-cmd "-R" option there is a check in create_event() if the trigger file exist, using the stat() call. It returns 0 if the file exists or -1 in case of an error. The check of the stat()'s return code is for positive number, which is always false and errors are never detected. Signed-off-by: Tzvetomir Stoyanov (VMware) --- tracecmd/trace-record.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tracecmd/trace-record.c b/tracecmd/trace-record.c index c8c853f8..ec3bcae9 100644 --- a/tracecmd/trace-record.c +++ b/tracecmd/trace-record.c @@ -2707,7 +2707,7 @@ create_event(struct buffer_instance *instance, char *path, struct event_list *ol if (ret < 0) die("Failed to allocate trigger path for %s", path); ret = stat(p, &st); - if (ret > 0) + if (ret < 0) die("trigger specified but not supported by this kernel"); event->trigger_file = p; } From patchwork Wed Mar 25 14:08:28 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Tzvetomir Stoyanov (VMware)" X-Patchwork-Id: 11457935 X-Patchwork-Delegate: rostedt@goodmis.org 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 EBE3A913 for ; Wed, 25 Mar 2020 14:08:37 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id CBC8A2078A for ; Wed, 25 Mar 2020 14:08:37 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="C8y4WiMp" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727686AbgCYOIh (ORCPT ); Wed, 25 Mar 2020 10:08:37 -0400 Received: from mail-lj1-f195.google.com ([209.85.208.195]:41936 "EHLO mail-lj1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727674AbgCYOIh (ORCPT ); Wed, 25 Mar 2020 10:08:37 -0400 Received: by mail-lj1-f195.google.com with SMTP id n17so2572124lji.8 for ; Wed, 25 Mar 2020 07:08:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=bx2vhLd9A10pPdSpJQawLLkRnk4zgAdWmR1tl4J7pcc=; b=C8y4WiMpJcp0RMRkaQ4LrZqPmZiEgpGyHw0npbbRv4yyC7BvXHfWrpQUK/GD6gZZDd yLX3XUDJUvp2voAbv4N3guthoBayJO+r7tzsY9cy93UT6a/q518Nmdj36kvj2hafBUTn nxsTsEOhQbklnXk6VxjMHD+EnoNn0o33K88eDjuAK1lft/Mkp9H5aww7laTjsz7ShQxv suTvcOiIgiKh16bkAYB2zXrzLI94VhFgdIPgCV+EfWP/IJwqpGlODkUTB/ouSQH9bTSW Z3vMjvR3BkA9YPi3eHm+xovWuUUDl/A7eQtTAa+S0qlST9jcQ10hw26nFH0fZt6DLxJ9 obyw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=bx2vhLd9A10pPdSpJQawLLkRnk4zgAdWmR1tl4J7pcc=; b=aBUfo13B3oDUtlpX2wcMRzunN9/JNZgFd9IAXSfly1Llnw8ru0xx+wLn3X8ioce+O1 QyWjZqzDr4nl1njC7qCurLxxuhXYHratEh/BcdIRNIfTLKGOj/mA3+djWzB4IMIruM0X 8/qmov7pzu9PR1RQjmbhIcZBEKfpXLyfIqfJGwIrkdbesEr91Js9eNnvfE0LyfqCpqKz Mv+9VelUYe8a/uNiqKvyScTXz2GoBp/yDn7oMXAk3k+wXlswUBD9rP49Hm0WxP8TLNuD Jabj2e7JRexT79iEFRm3ewtBkRpSGBMZ14W06cLFo7viJ5SLE7Y2/v239N4ofgv48ee7 8Ecg== X-Gm-Message-State: AGi0PublvQSYoTy+yaIvxPlyzOIPsnTflaSPJmx9crRRI4PRUkDv1So1 swaQqvCExgACj+b9ED4J4S8= X-Google-Smtp-Source: APiQypL8bnEjIwUxwq2MQBS40WBCtVKci0+rAmWtqMJO5SGhPiRKDF1yepX5qX/L5iN6SPBWLs0pRw== X-Received: by 2002:a2e:9bd1:: with SMTP id w17mr2030939ljj.283.1585145314865; Wed, 25 Mar 2020 07:08:34 -0700 (PDT) Received: from oberon.zico.biz ([83.222.187.186]) by smtp.gmail.com with ESMTPSA id v9sm12017301ljv.82.2020.03.25.07.08.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 25 Mar 2020 07:08:34 -0700 (PDT) From: "Tzvetomir Stoyanov (VMware)" To: rostedt@goodmis.org Cc: linux-trace-devel@vger.kernel.org Subject: [PATCH 2/3] trace-cmd: Fix double free error when triggers are configured on multiple events Date: Wed, 25 Mar 2020 16:08:28 +0200 Message-Id: <20200325140829.184651-3-tz.stoyanov@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200325140829.184651-1-tz.stoyanov@gmail.com> References: <20200325140829.184651-1-tz.stoyanov@gmail.com> 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 When using trace-cmd "-e sched:* -R ..." command to set triggers to the all events of given subsystem, trace-cmd fails with a double free error. The problem is in create_event() function, where the config is expanded to the all events. The same "event->trigger" pointer is copied to all events. Later, when the trigger is applied, the update_event() frees this pointer multiple times. Signed-off-by: Tzvetomir Stoyanov (VMware) --- tracecmd/trace-record.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tracecmd/trace-record.c b/tracecmd/trace-record.c index ec3bcae9..7dbf599a 100644 --- a/tracecmd/trace-record.c +++ b/tracecmd/trace-record.c @@ -2702,7 +2702,8 @@ create_event(struct buffer_instance *instance, char *path, struct event_list *ol else free(p); - if (event->trigger) { + if (old_event->trigger) { + event->trigger = strdup(old_event->trigger); ret = asprintf(&p, "%s/trigger", path_dirname); if (ret < 0) die("Failed to allocate trigger path for %s", path); @@ -2883,6 +2884,7 @@ static void expand_event_instance(struct buffer_instance *instance) event = compressed_list; compressed_list = event->next; expand_event(instance, event); + free(event->trigger); free(event); } } From patchwork Wed Mar 25 14:08:29 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Tzvetomir Stoyanov (VMware)" X-Patchwork-Id: 11457937 X-Patchwork-Delegate: rostedt@goodmis.org 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 7B48B14B4 for ; Wed, 25 Mar 2020 14:08:39 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 50D222076A for ; Wed, 25 Mar 2020 14:08:39 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="T0rGR6DZ" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727674AbgCYOIj (ORCPT ); Wed, 25 Mar 2020 10:08:39 -0400 Received: from mail-lj1-f193.google.com ([209.85.208.193]:33753 "EHLO mail-lj1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727685AbgCYOIi (ORCPT ); Wed, 25 Mar 2020 10:08:38 -0400 Received: by mail-lj1-f193.google.com with SMTP id f20so2631369ljm.0 for ; Wed, 25 Mar 2020 07:08:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=WvhwqahoZdltrwwlb5nBf/PbNg/5yRP/ddbkiNbh+P4=; b=T0rGR6DZnPrQ5AQtCg7iW9Ry7qeorJf7UPmD5+fHBSvMgzAbXRpYjBCN82sn21lxrF 68G1N+qpVHl0+HoTPvPtyi+HS7L1o0peedaa3Hp7x5pff86R/JD2vV+VieXiuiUhEn7N g03cxPdyoOIz2SaYVNQRRDZDiezAmif00VNXVVaDNysdQiNivfCEVpoP4/NzMzbPxuvW ab1nBv1O+QnVK4pAvjbQ1yEih5YNoFt5RmgbKd12loB4EDg4zS7i9EwsL4MHCQFH+V1Y UUvQDZB48soEqljpGs5xfUloFOQMaNDympFBX95demvO3Yu9wg5TBvh7jEZH9I2UXMHW kzKw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=WvhwqahoZdltrwwlb5nBf/PbNg/5yRP/ddbkiNbh+P4=; b=Hcb849x1vg7ihouHgqHi5MpZ1P2cmZl9SRAhigJW1qR27lPalm4beVczsKRTT+hNne mLrHRv8+KtpjC2EndaY5/mrP3Ch38YAY5hYhAkz9FLi74Q8h8+hrVET/Li52o4WrWAFd AZc16uqP4iM2Y9qQt0MmKGQlP2T5k9PB80/h/x2aXymFkLPgdcK7mxgCv81WRFmXyHqI tRu8cNJoIauY/dORjRk3h80J6tC45t2aWiMfPww4US68u7mUiGrHlgQ4U2CmzkGBtQ2l 9UOWegyCA/Aen1kDeU71Y3UypGD55qb1P/5dQvAjNa5hoHUe8HJqGlaNyFFyvAKrFTki EQEg== X-Gm-Message-State: AGi0Pua7lZq4FTedTsGsgz9URFc1nbhkVxvRQARUtdnYAXAvh11hw3CA ZdYqtWHVA9Ei9a/JksOGTJI= X-Google-Smtp-Source: APiQypKQClQJhG06M4DZhSj798++O2zJfcT3igIuw9lQKb9Aqq3YPKS0NaW8L2E5OSJNzdsLe8pJNw== X-Received: by 2002:a2e:94d5:: with SMTP id r21mr1996952ljh.81.1585145316206; Wed, 25 Mar 2020 07:08:36 -0700 (PDT) Received: from oberon.zico.biz ([83.222.187.186]) by smtp.gmail.com with ESMTPSA id v9sm12017301ljv.82.2020.03.25.07.08.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 25 Mar 2020 07:08:35 -0700 (PDT) From: "Tzvetomir Stoyanov (VMware)" To: rostedt@goodmis.org Cc: linux-trace-devel@vger.kernel.org Subject: [PATCH 3/3] trace-cmd: Fix setting triggers to all events from given system Date: Wed, 25 Mar 2020 16:08:29 +0200 Message-Id: <20200325140829.184651-4-tz.stoyanov@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200325140829.184651-1-tz.stoyanov@gmail.com> References: <20200325140829.184651-1-tz.stoyanov@gmail.com> 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 When running the "trace-cmd record -e (system) -R (trigger)" command for an event system, it fails with "no such file or directory error". This use case is supposed to apply the given trigger to all events from the system. Reported-by: Steven Rostedt (VMware) Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=206737 Signed-off-by: Tzvetomir Stoyanov (VMware) --- tracecmd/trace-record.c | 99 +++++++++++++++++++++++++++-------------- 1 file changed, 65 insertions(+), 34 deletions(-) diff --git a/tracecmd/trace-record.c b/tracecmd/trace-record.c index 7dbf599a..76305d1a 100644 --- a/tracecmd/trace-record.c +++ b/tracecmd/trace-record.c @@ -2658,6 +2658,21 @@ static void set_max_graph_depth(struct buffer_instance *instance, char *max_grap die("could not write to max_graph_depth"); } +static bool check_file_in_dir(char *dir, char *file) +{ + struct stat st; + char *path; + int ret; + + ret = asprintf(&path, "%s/%s", dir, file); + if (ret < 0) + die("Failed to allocate id file path for %s/%s", dir, file); + ret = stat(path, &st); + free(path); + if (ret < 0 || S_ISDIR(st.st_mode)) + return false; + return true; +} /** * create_event - create and event descriptor @@ -2703,14 +2718,19 @@ create_event(struct buffer_instance *instance, char *path, struct event_list *ol free(p); if (old_event->trigger) { - event->trigger = strdup(old_event->trigger); - ret = asprintf(&p, "%s/trigger", path_dirname); - if (ret < 0) - die("Failed to allocate trigger path for %s", path); - ret = stat(p, &st); - if (ret < 0) - die("trigger specified but not supported by this kernel"); - event->trigger_file = p; + if (check_file_in_dir(path_dirname, "trigger")) { + event->trigger = strdup(old_event->trigger); + ret = asprintf(&p, "%s/trigger", path_dirname); + if (ret < 0) + die("Failed to allocate trigger path for %s", path); + event->trigger_file = p; + } else { + /* Check if this is event or system. + * Systems do not have trigger files by design + */ + if (check_file_in_dir(path_dirname, "id")) + die("trigger specified but not supported by this kernel"); + } } return event; @@ -2815,14 +2835,29 @@ static int expand_event_files(struct buffer_instance *instance, return save_event_tail == instance->event_next; } +static int expand_events_all(struct buffer_instance *instance, + char *system_name, char *event_name, + struct event_list *event) +{ + char *name; + int ret; + + ret = asprintf(&name, "%s/%s", system_name, event_name); + if (ret < 0) + die("Failed to allocate system/event for %s/%s", + system_name, event_name); + ret = expand_event_files(instance, name, event); + free(name); + + return ret; +} + static void expand_event(struct buffer_instance *instance, struct event_list *event) { const char *name = event->event; char *str; char *ptr; - int len; int ret; - int ret2; /* * We allow the user to use "all" to enable all events. @@ -2833,41 +2868,37 @@ static void expand_event(struct buffer_instance *instance, struct event_list *ev return; } - ptr = strchr(name, ':'); + str = strdup(name); + if (!str) + die("Failed to allocate %s string", name); + ptr = strchr(str, ':'); if (ptr) { - len = ptr - name; - str = malloc(strlen(name) + 1); /* may add '*' */ - if (!str) - die("Failed to allocate event for %s", name); - strcpy(str, name); - str[len] = '/'; + *ptr = '\0'; ptr++; - if (!strlen(ptr)) { - str[len + 1] = '*'; - str[len + 2] = '\0'; - } - ret = expand_event_files(instance, str, event); + if (strlen(ptr)) + ret = expand_events_all(instance, str, ptr, event); + else + ret = expand_events_all(instance, str, "*", event); + if (!ignore_event_not_found && ret) die("No events enabled with %s", name); - free(str); - return; + + goto out; } /* No ':' so enable all matching systems and events */ - ret = expand_event_files(instance, name, event); - - len = strlen(name) + strlen("*/") + 1; - str = malloc(len); - if (!str) - die("Failed to allocate event for %s", name); - snprintf(str, len, "*/%s", name); - ret2 = expand_event_files(instance, str, event); - free(str); + ret = expand_event_files(instance, str, event); + ret &= expand_events_all(instance, "*", str, event); + if (event->trigger) + ret &= expand_events_all(instance, str, "*", event); - if (!ignore_event_not_found && ret && ret2) + if (!ignore_event_not_found && ret) die("No events enabled with %s", name); + +out: + free(str); } static void expand_event_instance(struct buffer_instance *instance)