]> granicus.if.org Git - transmission/commitdiff
(trunk libT) #3449 "overflow error in tr_truncd()" -- fixed.
authorCharles Kerr <charles@transmissionbt.com>
Sat, 24 Jul 2010 17:09:39 +0000 (17:09 +0000)
committerCharles Kerr <charles@transmissionbt.com>
Sat, 24 Jul 2010 17:09:39 +0000 (17:09 +0000)
libtransmission/utils-test.c
libtransmission/utils.c

index 63302e6e564a36a76f5d1a90cf5bf5e5430a8e05..0bf4285588669df8a706a3c1e6e12bcaf2e01511 100644 (file)
@@ -375,21 +375,31 @@ test_url( void )
     return 0;
 }
 
-int
-main( void )
+static int
+test_truncd( void )
 {
     char buf[32];
-    char *in, *out;
-    int   len;
-    int   i;
-    int   l;
 
-    /* tr_truncd */
     tr_snprintf( buf, sizeof( buf ), "%.2f%%", 99.999 );
     check( !strcmp( buf, "100.00%" ) );
+
     tr_snprintf( buf, sizeof( buf ), "%.2f%%", tr_truncd( 99.999, 2 ) );
     check( !strcmp( buf, "99.99%" ) );
 
+    tr_snprintf( buf, sizeof( buf ), "%.4f", tr_truncd( 403650.656250, 4 ) );
+    check( !strcmp( buf, "403650.6562" ) );
+
+    return 0;
+}
+
+int
+main( void )
+{
+    char *in, *out;
+    int   len;
+    int   i;
+    int   l;
+
     /* base64 */
     out = tr_base64_encode( "YOYO!", -1, &len );
     check( out );
@@ -425,6 +435,8 @@ main( void )
         return i;
     if( ( i = test_url( ) ) )
         return i;
+    if( ( i = test_truncd( ) ) )
+        return i;
 
     /* test that tr_cryptoRandInt() stays in-bounds */
     for( i = 0; i < 100000; ++i )
index b71a62033edad944a5ad150cf1e70b6c47a5125d..96a37cc021dbd27e325fd72cc19a72612cdc0b4b 100644 (file)
@@ -1386,7 +1386,7 @@ double
 tr_truncd( double x, int decimal_places )
 {
     const int i = (int) pow( 10, decimal_places );  
-    double x2 = (int)(x*i);
+    const double x2 = (int64_t)(x * i);
     return x2 / i;
 }