This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[perl #123874] fix argument underflow for pack()
authorHugo van der Sanden <hv@crypt.org>
Wed, 18 Feb 2015 14:59:53 +0000 (14:59 +0000)
committerHugo van der Sanden <hv@crypt.org>
Wed, 18 Feb 2015 16:06:58 +0000 (16:06 +0000)
NEXTFROM() modified the item count while testing it, so the next use
saw the count (of -1) as non-zero and ended up trying to write ~1 bytes.

pp_pack.c
t/op/pack.t

index e86de04..0cbe3c4 100644 (file)
--- a/pp_pack.c
+++ b/pp_pack.c
@@ -2094,7 +2094,7 @@ S_pack_rec(pTHX_ SV *cat, tempsym_t* symptr, SV **beglist, SV **endlist )
        char *cur   = start + SvCUR(cat);
         bool needs_swap;
 
-#define NEXTFROM (lengthcode ? lengthcode : items-- > 0 ? *beglist++ : &PL_sv_no)
+#define NEXTFROM (lengthcode ? lengthcode : items > 0 ? (--items, *beglist++) : &PL_sv_no)
 #define PEEKFROM (lengthcode ? lengthcode : items > 0 ? *beglist : &PL_sv_no)
 
         switch (howlen) {
index 8b464dd..9416ad6 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 => 14707;
+plan tests => 14708;
 
 use strict;
 use warnings qw(FATAL all);
@@ -2012,3 +2012,7 @@ package o {
 is pack("c", bless [], "o"), chr(42), 'overloading called';
 is $o::str, undef, 'pack "c" does not call string overloading';
 is $o::num, 1,     'pack "c" does call num overloading';
+
+#[perl #123874]: argument underflow leads to corrupt length
+eval q{ pack "pi/x" };
+ok(1, "argument underflow did not crash");