Wednesday, March 24, 2021

Re: [PATCH] fix valgrind abort

On Thu, Mar 25, 2021 at 09:50:17AM +0900, Masato Asou wrote:
> Hi ports,
>
> The valgrind was aborted after updated Pert to 5.32.1 as below:
>
> $ sysctl -n kern.version
> OpenBSD 6.9-beta (GENERIC.MP) #428: Wed Mar 24 11:12:16 MDT 2021
> deraadt@amd64.openbsd.org:/usr/src/sys/arch/amd64/compile/GENERIC.MP
>
> $ /usr/bin/perl --version
>
> This is perl 5, version 32, subversion 1 (v5.32.1) built for amd64-openbsd
> </snip>
>
> $ cd /usr/ports/devel/valgrind
> $ doas make install
> $ valgrind /bin/ls
> Abort trap
> $
>
> Because, Perl 5.32.1 has changed the way hexadecimal string are
> handled as below:
>
> Perl 5.30.3: "0x1234" + 0x1000 -> 0x2234
> Perl 5.32.1: "0x1234" + 0x1000 -> 0x1000

Interestingly, this bug only existed in perl v5.30, so an unfortunate
accident of timing on the creation of this patch.

$ perldoc perl5320delta | grep -B4 134230
• Perl no longer treats strings starting with "0x" or "0b" as hex or
binary numbers respectively when converting a string to a number.
This reverts a change in behaviour inadvertently introduced in perl
5.30.0 intended to improve precision when converting a string to a
floating point number. [perl #134230
<https://rt.perl.org/Ticket/Display.html?id=134230>]


> Perl 5.32.1 does not consider anything after 'x' to be a number, but
> only the first '0' is consider to be a number.

Neither does any other perl 5, only perl 5.30 accidentally did.

Perl simplistically looks for leading ascii digits in in a string to
"convert" from a string to a number, and an empty string is treated as
0. Just because the unquoted version would be treated differently
isn't supposed to matter.

$ perl -E 'say "$_: " . ( "${_}x123" + 0 ) for qw< 0 1 987 a z >'
0: 0
1: 1
987: 987
a: 0
z: 0



> I made the following patch.
>
> ok? comments?
> --
> ASOU Masato
>
> Index: devel/valgrind/patches/patch-coregrind_link_tool_exe_openbsd_in
> ===================================================================
> RCS file: /cvs/ports/devel/valgrind/patches/patch-coregrind_link_tool_exe_openbsd_in,v
> retrieving revision 1.5
> diff -u -p -r1.5 patch-coregrind_link_tool_exe_openbsd_in
> --- devel/valgrind/patches/patch-coregrind_link_tool_exe_openbsd_in 5 Oct 2020 01:45:58 -0000 1.5
> +++ devel/valgrind/patches/patch-coregrind_link_tool_exe_openbsd_in 25 Mar 2021 00:27:19 -0000
> @@ -10,7 +10,7 @@
> +# strip command rewrite offset and align in ELF file. Therefor, when valgrind
> +# launch memcheck-amd64-openbsd, an Abort trap occurs in the execvp() system
> +# call.
> -+my $cmd = sprintf "$cc -static -nopie -Wl,--strip-all -Wl,-Ttext=0x%x", "$ala + 0x1000";
> ++my $cmd = sprintf "$cc -static -nopie -Wl,--strip-all -Wl,-Ttext=0x%x", hex($ala) + 0x1000;

This seems to give consistent results on all the perl I have from 5.8
through 5.33.7.

perl -e 'my $ala = "0x1234"; print(( $ala + 0x100 ), "\n"); print(( hex($ala) + 0x100 ), "\n")'

OK afresh1@


>
> -# so, build up the complete command here:
> -# 'cc' -static -Ttext='ala' 'restargs'
>

--
andrew - http://afresh1.com

Instructions are just another man's opinion of how to do something.
-- Weldboy #DPWisdom

No comments:

Post a Comment