This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
(perl #132655) nul terminate result of unpack "u" of invalid data
authorTony Cook <tony@develop-help.com>
Mon, 20 Aug 2018 06:31:45 +0000 (16:31 +1000)
committerTony Cook <tony@develop-help.com>
Fri, 21 Sep 2018 00:23:08 +0000 (10:23 +1000)
In the given test case, Perl_atof2() would run off the end of the PV,
producing an error from ASAN.

pp_pack.c
t/op/pack.t

index 5e9cc64..f8be9d4 100644 (file)
--- a/pp_pack.c
+++ b/pp_pack.c
@@ -1727,7 +1727,10 @@ S_unpack_rec(pTHX_ tempsym_t* symptr, const char *s, const char *strbeg, const c
            if (!checksum) {
                 const STRLEN l = (STRLEN) (strend - s) * 3 / 4;
                sv = sv_2mortal(newSV(l));
-               if (l) SvPOK_on(sv);
+               if (l) {
+                    SvPOK_on(sv);
+                    *SvEND(sv) = '\0';
+                }
            }
 
             /* Note that all legal uuencoded strings are ASCII printables, so
index cf0e286..bb9f865 100644 (file)
@@ -12,7 +12,7 @@ my $no_endianness = $] > 5.009 ? '' :
 my $no_signedness = $] > 5.009 ? '' :
   "Signed/unsigned pack modifiers not available on this perl";
 
-plan tests => 14717;
+plan tests => 14718;
 
 use strict;
 use warnings qw(FATAL all);
@@ -2081,3 +2081,10 @@ SKIP:
     fresh_perl_like('pack "c10f1073741824"', qr/Out of memory during pack/, { stderr => 1 },
                    "integer overflow calculating allocation (multiply)");
 }
+
+{
+    # [perl #132655] heap-buffer-overflow READ of size 11
+    # only expect failure under ASAN (and maybe valgrind)
+    fresh_perl_is('0.0 + unpack("u", "ab")', "", { stderr => 1 },
+                  "ensure unpack u of invalid data nul terminates result");
+}