@@ -188,11 +188,21 @@ static uint64_t s_time_radix_conversion_read(int size)
188188   uint64_t  t1 ;
189189
190190   /* "size" is given as "number of limbs" and starts at 8 */ 
191-    length  =  ((size_t )size  -  7u ) *  MP_DIGIT_BIT ;
192- 
193-    /* Over-estimate number of base 10 digits */ 
194-    /* TODO: can overflow with small INT_MAX */ 
195-    length  =  (length  *  28u ) / 93u  +  2u ;
191+    length  =  (size_t )(size  *  MP_DIGIT_BIT );
192+ 
193+    /* Over-estimate number of base 10 digits 
194+       Magick number: 28/93 = CF(log_10(2))_(p_3, q_3) 
195+     */ 
196+    written  =  (length  *  28u );
197+    /* May happen e.g. if size > 2184  with MP_16BIT 
198+       but cutoff should be about a couple of thousand bits 
199+       at most (around or above Karatsuba cutoff). 
200+     */ 
201+    if  (length  !=  written  / 28u ) {
202+       t1  =  UINT64_MAX ;
203+       goto LBL_ERR_1 ;
204+    }
205+    length  =  written  / 93u  +  2u ;
196206
197207   if  ((err  =  random_number (& str_a , length )) !=  MP_OKAY ) {
198208      t1  =  UINT64_MAX ;
@@ -659,9 +669,11 @@ int main(int argc, char **argv)
659669         if  (test [n ].fn  !=  NULL ) {
660670            s_run (test [n ].name , test [n ].fn , test [n ].cutoff );
661671            /* TODO: can overflow for small INT_MAX */ 
662-             * test [n ].update  =  ((* test [n ].cutoff ) *  MP_DIGIT_BIT  *  93 )/28 ;
672+             * test [n ].update  =  (* test [n ].cutoff ) *  MP_DIGIT_BIT ;
673+             * test [n ].cutoff  =  INT_MAX ;
663674         }
664675      }
676+ 
665677   }
666678   if  (args .terse  ==  1 ) {
667679      printf ("%d %d %d %d %d %d\n" ,
0 commit comments