Skip to content

Commit

Permalink
Fix some int/long confusion issues in GMP
Browse files Browse the repository at this point in the history
mpz_setbit seems to have limit of INT_MAX * GMP_NUMB_BITS on
the number of bits supported, and will abort() if that limit
is exceeded.
  • Loading branch information
smalyshev committed Jan 2, 2018
1 parent 2f56142 commit c0f0a0a
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 1 deletion.
6 changes: 5 additions & 1 deletion ext/gmp/gmp.c
Original file line number Diff line number Diff line change
Expand Up @@ -1628,7 +1628,7 @@ ZEND_FUNCTION(gmp_prob_prime)

FETCH_GMP_ZVAL(gmpnum_a, gmpnumber_arg, temp_a);

RETVAL_LONG(mpz_probab_prime_p(gmpnum_a, reps));
RETVAL_LONG(mpz_probab_prime_p(gmpnum_a, (int)reps));
FREE_GMP_TEMP(temp_a);
}
/* }}} */
Expand Down Expand Up @@ -1956,6 +1956,10 @@ ZEND_FUNCTION(gmp_setbit)
php_error_docref(NULL, E_WARNING, "Index must be greater than or equal to zero");
RETURN_FALSE;
}
if (index / GMP_NUMB_BITS >= INT_MAX ) {
php_error_docref(NULL, E_WARNING, "Index must be less than %ld * %ld", INT_MAX, GMP_NUMB_BITS);
RETURN_FALSE;
}

gmpnum_a = GET_GMP_FROM_ZVAL(a_arg);

Expand Down
26 changes: 26 additions & 0 deletions ext/gmp/tests/gmp_setbit_long.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
--TEST--
gmp_setbit() with large index
--SKIPIF--
<?php if (!extension_loaded("gmp")) print "skip"; ?>
<?php if (PHP_INT_SIZE != 8) die("skip this test is for 64bit platform only"); ?>
<?php if (getenv("SKIP_SLOW_TESTS")) die("skip slow test"); ?>
--FILE--
<?php

$n = gmp_init("227200");
for($a = 1<<30; $a > 0 && $a < 0x8000000000; $a <<= 2) {
$i = $a - 1;
printf("%X\n", $i);
gmp_setbit($n, $i, 1);
}
echo "Done\n";
?>
--EXPECTF--
3FFFFFFF
FFFFFFFF
3FFFFFFFF
FFFFFFFFF
3FFFFFFFFF

Warning: gmp_setbit(): Index must be less than %d * %d in %s/gmp_setbit_long.php on line %d
Done

0 comments on commit c0f0a0a

Please sign in to comment.