@@ -188,11 +188,21 @@ static uint64_t s_time_radix_conversion_read(int size)
188
188
uint64_t t1 ;
189
189
190
190
/* "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 ;
196
206
197
207
if ((err = random_number (& str_a , length )) != MP_OKAY ) {
198
208
t1 = UINT64_MAX ;
@@ -659,9 +669,11 @@ int main(int argc, char **argv)
659
669
if (test [n ].fn != NULL ) {
660
670
s_run (test [n ].name , test [n ].fn , test [n ].cutoff );
661
671
/* 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 ;
663
674
}
664
675
}
676
+
665
677
}
666
678
if (args .terse == 1 ) {
667
679
printf ("%d %d %d %d %d %d\n" ,
0 commit comments