my_atof3() Fix uncommon bug where it wrongly fails
authorKarl Williamson <khw@cpan.org>
Fri, 18 Jan 2019 18:30:00 +0000 (11:30 -0700)
committerKarl Williamson <khw@cpan.org>
Sat, 19 Jan 2019 04:48:16 +0000 (21:48 -0700)
This bug showed up only on -Dusemymalloc without Debugging, and without
various other common Configure options.

It causes my_atof3() to return failure where in fact success was
achieved.  It apparently got triggered due to slight differences in
malloc behaviors.

The bug is that it changed a string pointer to new memory and forgot to
change it back to the original value when that memory got freed.  The
test that fails is an equal/not equal of two pointers, and usually two
pointers aren't the same, meaning the bug doesn't appear.

The only case where my_atof3() is called is in parsing certain
\p{nv=...} where "..." is not a rational number.  So the scope of this
bug is limited.

Spotted by Ryan Voots.

numeric.c

index e5e08cb..9804a9b 100644 (file)
--- a/numeric.c
+++ b/numeric.c
@@ -1465,6 +1465,7 @@ Perl_my_atof3(pTHX_ const char* orig, NV* value, STRLEN len)
         /* If we created a copy, 'endp' is in terms of that.  Convert back to
          * the original */
         if (copy) {
+            s = (s - copy) + (char *) orig;
             endp = (endp - copy) + (char *) orig;
             Safefree(copy);
         }