summaryrefslogtreecommitdiff
path: root/ext/standard/rand.c
diff options
context:
space:
mode:
authorHartmut Holzgraefe <hholzgra@php.net>2000-05-22 20:37:26 +0000
committerHartmut Holzgraefe <hholzgra@php.net>2000-05-22 20:37:26 +0000
commit398923de533c76113c16019362b214584f5da467 (patch)
tree27383c0a47c2b120e4279098edc7a8ca0c5b6164 /ext/standard/rand.c
parentcde504ad27003aa64e8eb5c752cdcb6460a467af (diff)
downloadphp-git-398923de533c76113c16019362b214584f5da467.tar.gz
in [mt_]rand(): (see BUG #3353)
- additional range checking for (max-min)<=[MT_]RAND_MAX - [mt_]rand(0,[mt_]getrandmax()) will now work without integer overflow
Diffstat (limited to 'ext/standard/rand.c')
-rw-r--r--ext/standard/rand.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/ext/standard/rand.c b/ext/standard/rand.c
index 712197bd0f..73b81f922a 100644
--- a/ext/standard/rand.c
+++ b/ext/standard/rand.c
@@ -243,6 +243,8 @@ PHP_FUNCTION(rand)
convert_to_long_ex(p_max);
if ((*p_max)->value.lval-(*p_min)->value.lval <= 0) {
php_error(E_WARNING,"rand(): Invalid range: %ld..%ld", (*p_min)->value.lval, (*p_max)->value.lval);
+ }else if ((*p_max)->value.lval-(*p_min)->value.lval > RAND_MAX){
+ php3_error(E_WARNING,"rand(): Invalid range: %ld..%ld", (*p_min)->value.lval, (*p_max)->value.lval);
}
break;
default:
@@ -287,7 +289,7 @@ PHP_FUNCTION(rand)
*/
if (p_min && p_max) { /* implement range */
return_value->value.lval = (*p_min)->value.lval +
- (int)((double)((*p_max)->value.lval - (*p_min)->value.lval + 1) * return_value->value.lval/(PHP_RAND_MAX+1.0));
+ (int)((double)((*p_max)->value.lval - (*p_min)->value.lval + 1.0) * return_value->value.lval/(PHP_RAND_MAX+1.0));
}
}
/* }}} */
@@ -308,7 +310,9 @@ PHP_FUNCTION(mt_rand)
convert_to_long_ex(p_min);
convert_to_long_ex(p_max);
if ((*p_max)->value.lval-(*p_min)->value.lval <= 0) {
- php_error(E_WARNING,"mtrand(): Invalid range: %ld..%ld", (*p_min)->value.lval, (*p_max)->value.lval);
+ php_error(E_WARNING,"mt_rand(): Invalid range: %ld..%ld", (*p_min)->value.lval, (*p_max)->value.lval);
+ }else if ((*p_max)->value.lval-(*p_min)->value.lval > MT_RAND_MAX){
+ php3_error(E_WARNING,"mt_rand(): Invalid range: %ld..%ld",(*p_min)->value.lval, (*p_max)->value.lval);
}
break;
default:
@@ -329,7 +333,7 @@ PHP_FUNCTION(mt_rand)
if (p_min && p_max) { /* implement range */
return_value->value.lval = (*p_min)->value.lval +
- (long)((double)((*p_max)->value.lval - (*p_min)->value.lval + 1) * return_value->value.lval/(MT_RAND_MAX+1.0));
+ (long)((double)((*p_max)->value.lval - (*p_min)->value.lval + 1.0) * return_value->value.lval/(MT_RAND_MAX+1.0));
}
}
/* }}} */