cvs: php3 /functions/ rand.c
| From: | Hartmut Holzgraefe | Date: | Mon, 22 May 2000 17:31:42 +0000 |
| Subject: | cvs: php3 /functions/ rand.c | ||
| Groups: | php.dev | ||
| Request: | Send a blank email to php-dev+get-19235@lists.php.net to get a copy of this message | ||
hholzgra Mon May 22 19:31:42 2000 EDT
Modified files:
/php3/functions rand.c
Log:
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
Index: php3/functions/rand.c
diff -u php3/functions/rand.c:1.38 php3/functions/rand.c:1.39
--- php3/functions/rand.c:1.38 Mon May 22 19:01:50 2000
+++ php3/functions/rand.c Mon May 22 19:31:41 2000
@@ -30,7 +30,7 @@
| Based on code from: Shawn Cokus <Cokus@math.washington.edu> |
+----------------------------------------------------------------------+
*/
-/* $Id: rand.c,v 1.38 2000/05/22 17:01:50 hholzgra Exp $ */
+/* $Id: rand.c,v 1.39 2000/05/22 17:31:41 hholzgra Exp $ */
#include <stdlib.h>
@@ -267,6 +267,8 @@
convert_to_long(p_max);
if (p_max->value.lval-p_min->value.lval <= 0) {
php3_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:
@@ -311,7 +313,7 @@
*/
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));
}
}
/* }}} */
@@ -331,8 +333,10 @@
}
convert_to_long(p_min);
convert_to_long(p_max);
- if (p_max->value.lval-p_min->value.lval <= 0) {
- php3_error(E_WARNING,"mtrand(): Invalid range: %ld..%ld", p_min->value.lval,
p_max->value.lval);
+ if (p_max->value.lval-p_min->value.lval <=0) {
+ php3_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:
@@ -354,7 +358,7 @@
/* see the comment in the php3_rand() function about this ugly algorithm */
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/(MT_RAND_MAX+1.0));
+ (int)((double)(p_max->value.lval - p_min->value.lval + 1.0) *
return_value->value.lval/(MT_RAND_MAX+1.0));
}
}
/* }}} */