[PHP-DEV] cvs: php3 /functions/ rand.c From: Hartmut Holzgraefe (hholzgra <email protected>)
Date: 05/22/00

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 <email protected>> |
    +----------------------------------------------------------------------+
  */
-/* $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));
         }
 }
 /* }}} */

-- 
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, e-mail: php-dev-unsubscribe <email protected>
For additional commands, e-mail: php-dev-help <email protected>
To contact the list administrators, e-mail: php-list-admin <email protected>