From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.1 required=3.0 tests=ALL_TRUSTED,AWL,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF shortcircuit=no autolearn=ham autolearn_force=no version=3.4.6 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id CEB921FA2C for ; Wed, 11 Jan 2023 01:12:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=80x24.org; s=selector1; t=1673399569; bh=30tbVX6JpV/WmzuuRRCAj3krixQjCgRhBUs9e0nomgk=; h=From:To:Subject:Date:In-Reply-To:References:From; b=eKQ5Oz0cRlOsXVX5TpvO0Ak1VfwyX6LqjLoGnWOGfgAWlCcmH+xPJk613tRwSbDg4 JPNe4oqmnu8+JHfIjQ2wvF7S36RE+iFR23w8RVaDnVom9DiriENe/LFf3PXsLpw9Iu 7QoqUhJ8dNbvhqVVR5JAYakRIviMPYfSau51j4UM= From: Eric Wong To: mwrap-perl@80x24.org Subject: [PATCH 3/4] %p => PID expansion for dump_path + dump_csv Date: Wed, 11 Jan 2023 01:12:48 +0000 Message-Id: <20230111011249.2713039-4-e@80x24.org> In-Reply-To: <20230111011249.2713039-1-e@80x24.org> References: <20230111011249.2713039-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: This makes it possible to dump per-PID files for processes which fork. `%p' matches what the Linux sys.kernel.core_pattern sysctl understands. --- mwrap_core.h | 15 +++++++++++++++ script/mwrap-perl | 6 ++++++ t/mwrap.t | 15 +++++++++++++++ 3 files changed, 36 insertions(+) diff --git a/mwrap_core.h b/mwrap_core.h index fff0538..86e4498 100644 --- a/mwrap_core.h +++ b/mwrap_core.h @@ -895,12 +895,27 @@ __attribute__ ((destructor)) static void mwrap_dtor(void) if (dump_path) { char *end = strchr(dump_path, ','); char buf[PATH_MAX]; + AUTO_FREE char *pid_path = NULL; if (end) { mwrap_assert((end - dump_path) < (intptr_t)sizeof(buf)); end = mempcpy(buf, dump_path, end - dump_path); *end = 0; dump_path = buf; } + + /* %p => PID expansion (Linux core_pattern uses %p, too) */ + if ((s = strchr(dump_path, '%')) && s[1] == 'p' && + /* don't allow injecting extra formats: */ + !strchr(s + 2, '%')) { + s[1] = 'd'; /* s/%p/%d/ to make asprintf happy */ + int n = asprintf(&pid_path, dump_path, (int)getpid()); + if (n < 0) + fprintf(stderr, + "asprintf failed: %m, dumping to %s\n", + dump_path); + else + dump_path = pid_path; + } dump_fd = open(dump_path, O_CLOEXEC|O_WRONLY|O_APPEND|O_CREAT, 0666); if (dump_fd < 0) { diff --git a/script/mwrap-perl b/script/mwrap-perl index eb29176..371aee6 100644 --- a/script/mwrap-perl +++ b/script/mwrap-perl @@ -76,6 +76,10 @@ Dumps the output at exit to a given filename: total_bytes call_count location +C<$FILENAME> may contain C<%p> where C<%p> is a placeholder for +the PID being dumped. No other use of C<%> is accepted, and +multiple C<%> means all C<%> (including C<%p>) are handled as-is. + =item dump_fd:$DESCRIPTOR As with dump_path, but dumps the output to a given file descriptor. @@ -90,6 +94,8 @@ but is subject to change in future releases. C without the C<:> may also be used in conjunction with C, such as C. +Expands C<%p> to the PID in C<$FILENAME> as described for C + =back =head1 HTTP POST API diff --git a/t/mwrap.t b/t/mwrap.t index ccd739b..783f6e7 100644 --- a/t/mwrap.t +++ b/t/mwrap.t @@ -42,6 +42,21 @@ my $dump = "$mwrap_tmp/dump"; $nr_comma = ($s =~ tr/,/,/); $nr_cr = ($s =~ tr/\n/\n/); ok($nr_comma > ($nr_cr * 4), 'CSV has more commas than CR'); + + $env->{MWRAP} = "dump_path:$dump.%p"; + mwrap_run('dump_path PID expansion', $env, '-e', $script); + my @d = grep(/\.\d+\z/, glob("$dump.*")); + is(scalar(@d), 1, 'got PID file') or diag explain([glob("$dump*")]); + unlink(@d) or BAIL_OUT "unlink: $!"; + + # don't allow injecting random formats + for my $fmt ('%p.%m', '%m.%p') { + my $fn = $dump.$fmt; + $env->{MWRAP} = "dump_path:$fn"; + mwrap_run("PID expansion fails on $fmt", $env, '-e', $script); + ok($fn, "$fmt used as-is"); + unlink($fn) or BAIL_OUT "unlink: $!"; + } } SKIP: { # C++ program which uses malloc via "new"