This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
product() with zero IV crash/hang
authorJarkko Hietaniemi <jhi@iki.fi>
Mon, 29 Feb 2016 13:39:02 +0000 (08:39 -0500)
committerJarkko Hietaniemi <jhi@iki.fi>
Tue, 1 Mar 2016 01:44:20 +0000 (20:44 -0500)
CID 104785: Division or modulo by zero (DIVIDE_BY_ZERO)
238. divide_by_zero: In expression 9223372036854775807L / retiv, division by expression retiv which may be zero has undefined behavior.
215                if(!SvNOK(sv) && SvIOK(sv) && (SvIV(sv) < IV_MAX / retiv)) {

Cherry-pick of the changes in
https://rt.cpan.org/Public/Bug/Display.html?id=105415

cpan/Scalar-List-Utils/ListUtil.xs
cpan/Scalar-List-Utils/t/product.t

index 504c70e..04dca10 100644 (file)
@@ -212,7 +212,8 @@ CODE:
             break;
         case ACC_IV:
             if(is_product) {
-                if(!SvNOK(sv) && SvIOK(sv) && (SvIV(sv) < IV_MAX / retiv)) {
+              if(retiv == 0 ||
+                 (!SvNOK(sv) && SvIOK(sv) && (SvIV(sv) < IV_MAX / retiv))) {
                     retiv *= SvIV(sv);
                     break;
                 }
index c397f82..38c923b 100644 (file)
@@ -3,7 +3,7 @@
 use strict;
 use warnings;
 
-use Test::More tests => 13;
+use Test::More tests => 14;
 
 use List::Util qw(product);
 
@@ -19,6 +19,9 @@ is( $v, 24, '4 args');
 $v = product(-1);
 is( $v, -1, 'one -1');
 
+$v = product(0, 1, 2);
+is( $v, 0, 'first factor zero' );
+
 my $x = -3;
 
 $v = product($x, 3);