[PATCH v2] malloc: Replace shell/Perl gate in mtrace
Carlos O'Donell
carlos@redhat.com
Thu Jun 20 12:04:17 GMT 2024
On 6/20/24 7:20 AM, Florian Weimer wrote:
> The previous version expanded $0 and $@ twice.
>
> The new version defines a q no-op shell command. The Perl syntax
> error is masked by the eval Perl function. The q { … } construct
> is executed by the shell without errors because the q shell function
> was defined, but treated as a non-expanding quoted string by Perl,
> effectively hiding its context from the Perl interpreter. As before
> the script is read by require instead of executed directly, to avoid
> infinite recursion because the #! line contains /bin/sh.
>
> Introduce the “fatal” function to produce diagnostics that are not
> suppressed by “do”. Use “do” instead of “require” because it has
> fewer requirements on the executed script that “require”.
>
> Add the s,,, construct to prefix relative paths with './'
> because “do” (and “require“ before that) searches for the script
> in @INC if the path is relative and does not start with './'.
> Use $_ to make the trampoline shorter.
The error message is a little bit odd with the injected "./" appearing
in the progname, but OK, if we can improve it that would be better.
Test for no arguments:
$ /usr/bin/mtrace
Wrong number of arguments, run /./usr/bin/mtrace --help for help.
Test for quoting of spaces in error:
$ /usr/bin/mtrace "/home/carlos odonell/elf/tst-leaks1.mtrace"
/./usr/bin/mtrace: Cannot open mtrace data file /home/carlos odonell/elf/tst-leaks1.mtrace: No such file or directory
Test for relative path:
$ /usr/bin/mtrace elf/tst-leaks1.mtrace
- 0x0000555555ea6300 Free 2 was never alloc'd 0x85eac
- 0x0000555555ea62a0 Free 43 was never alloc'd 0x864b2
No memory leaks.
Test for relative path with spaces and quoting:
$ /usr/bin/mtrace "elf/tst space leaks1.mtrace"
- 0x0000555555ea6300 Free 2 was never alloc'd 0x85eac
- 0x0000555555ea62a0 Free 43 was never alloc'd 0x864b2
No memory leaks.
Tested-by: Carlos O'Donell <carlos@redhat.com>
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
> ---
> v2: Add ./ to relative paths, some other cleanups.
> malloc/mtrace.pl | 20 ++++++++++++++++----
> 1 file changed, 16 insertions(+), 4 deletions(-)
>
> diff --git a/malloc/mtrace.pl b/malloc/mtrace.pl
> index dc6085820e..ba14be6cae 100644
> --- a/malloc/mtrace.pl
> +++ b/malloc/mtrace.pl
> @@ -1,6 +1,11 @@
> #! /bin/sh
> -eval exec "perl -e 'shift; \$progname=shift; shift; require \$progname'" . "$0" . "$@"
> - if 0;
> +eval "q () {
> + :
> +}";
> +q {
> + exec perl -e '$_ = shift; s,([^/]),./\1,; do $_' "$0" "$@"
> +}
> +;
> # Copyright (C) 1997-2024 Free Software Foundation, Inc.
> # This file is part of the GNU C Library.
> # Based on the mtrace.awk script.
> @@ -22,6 +27,7 @@ eval exec "perl -e 'shift; \$progname=shift; shift; require \$progname'" . "$0"
> $VERSION = "@VERSION@";
> $PKGVERSION = "@PKGVERSION@";
> $REPORT_BUGS_TO = '@REPORT_BUGS_TO@';
> +$progname = $_;
>
> sub usage {
> print "Usage: mtrace [OPTION]... [Binary] MtraceData\n";
> @@ -33,6 +39,11 @@ sub usage {
> exit 0;
> }
>
> +sub fatal {
> + print STDERR "$_[0]\n";
> + exit 1;
> +}
> +
> # We expect two arguments:
> # #1: the complete path to the binary
> # #2: the mtrace data filename
> @@ -86,7 +97,7 @@ if ($#ARGV == 0) {
> close (LOCS);
> }
> } else {
> - die "Wrong number of arguments, run $progname --help for help.";
> + fatal "Wrong number of arguments, run $progname --help for help.";
> }
>
> sub addr2line {
> @@ -148,7 +159,8 @@ sub location {
> }
>
> $nr=0;
> -open(DATA, "<$data") || die "Cannot open mtrace data file";
> +open(DATA, "<$data")
> + or fatal "$progname: Cannot open mtrace data file $data: $!";
> while (<DATA>) {
> my @cols = split (' ');
> my $n, $where;
>
> base-commit: 71dafdf5f19dd2b0729e4774149944911a405bc6
>
--
Cheers,
Carlos.
More information about the Libc-alpha
mailing list