From: Steven Rostedt <rostedt@goodmis.org>
To: Linux Trace Devel <linux-trace-devel@vger.kernel.org>
Cc: Sharon Gabay <Sharon.Gabay@mobileye.com>
Subject: [PATCH] trace-cmd split: Fix creation of temp files to include output name
Date: Mon, 10 Jul 2023 12:50:31 -0400	[thread overview]
Message-ID: <20230710125031.0e140727@gandalf.local.home> (raw)
From: "Steven Rostedt (Google)" <rostedt@goodmis.org>
The creation of the temp files for creating the split did the following:
	output = strdup(output_file);
	dir = dirname(output);
	base = basename(output);
The problem with the above is that dirname() modifies "output" to add a
'\0' after the directory name. That is, if we had output_file = '/tmp/test';
Then the following will happen:
	output = copy of "/tmp/test"
	dir = dirname(output);
This will set dir to "/tmp" and insert a '\0' into the second '/'. This
also has the side effect of changing output to "/tmp" as well.
Then to get the base name:
	base = basename(output);
base will end up as "tmp" and not as "test". The temp file will then be:
		ret = asprintf(&file, "%s/.tmp.%s.%d", dir, base, cpu);
	"/tmp/.tmp.tmp.1"
This is incorrect, as it should have been "/tmp/.tmp.test.1".
This can easily be fixed by swapping the assignment of dir and base:
	base = basename(output);
	dir = dirname(output);
As then, after the assignment of base, base would be "test" and output
would still be "/tmp/test", allowing for dir to get "/tmp".
Link: https://lore.kernel.org/linux-trace-users/VE1PR09MB3535122A0DA44242886307B9F233A@VE1PR09MB3535.eurprd09.prod.outlook.com/
Reported-by: Sharon Gabay <Sharon.Gabay@mobileye.com>
Fixes: d9b58d42c43c2 ("trace-cmd: Fix temp files in trace-cmd split to include directories")
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
---
 tracecmd/trace-split.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/tracecmd/trace-split.c b/tracecmd/trace-split.c
index 59df1d02b345..4fda781307e6 100644
--- a/tracecmd/trace-split.c
+++ b/tracecmd/trace-split.c
@@ -367,8 +367,9 @@ static double parse_file(struct tracecmd_input *handle,
 	int fd;
 
 	output = strdup(output_file);
-	dir = dirname(output);
+	/* Extract basename() first, as dirname() truncates output */
 	base = basename(output);
+	dir = dirname(output);
 
 	ohandle = tracecmd_copy(handle, output_file, TRACECMD_FILE_CMD_LINES, 0, NULL);
 
-- 
2.39.2
                 reply	other threads:[~2023-07-10 16:50 UTC|newest]
Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox
  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):
  git send-email \
    --in-reply-to=20230710125031.0e140727@gandalf.local.home \
    --to=rostedt@goodmis.org \
    --cc=Sharon.Gabay@mobileye.com \
    --cc=linux-trace-devel@vger.kernel.org \
    /path/to/YOUR_REPLY
  https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
  Be sure your reply has a Subject: header at the top and a blank line
  before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).