Browse code

bb#11267 - libclamav upx guard against signed overflows

Kevin Lin authored on 2015/02/25 06:21:46
Showing 1 changed files
... ...
@@ -317,6 +317,8 @@ int upx_inflate2b(const char *src, uint32_t ssize, char *dst, uint32_t *dsize, u
317 317
     while (1) {
318 318
       if ( (oob = doubleebx(src, &myebx, &scur, ssize)) == -1 )
319 319
         return -1;
320
+      if (backbytes >= (INT_MAX / 2) + oob)
321
+	      return -1;
320 322
       backbytes = backbytes*2+oob;
321 323
       if ( (oob = doubleebx(src, &myebx, &scur, ssize)) == -1 )
322 324
 	return -1;
... ...
@@ -392,6 +394,8 @@ int upx_inflate2d(const char *src, uint32_t ssize, char *dst, uint32_t *dsize, u
392 392
     while (1) {
393 393
       if ( (oob = doubleebx(src, &myebx, &scur, ssize)) == -1 )
394 394
         return -1;
395
+      if (backbytes >= (INT_MAX / 2) + oob)
396
+	      return -1;
395 397
       backbytes = backbytes*2+oob;
396 398
       if ( (oob = doubleebx(src, &myebx, &scur, ssize)) == -1 )
397 399
         return -1;
... ...
@@ -400,6 +404,8 @@ int upx_inflate2d(const char *src, uint32_t ssize, char *dst, uint32_t *dsize, u
400 400
       backbytes--;
401 401
       if ( (oob = doubleebx(src, &myebx, &scur, ssize)) == -1 )
402 402
         return -1;
403
+      if (backbytes >= (INT_MAX / 2) + oob)
404
+	      return -1;
403 405
       backbytes=backbytes*2+oob;
404 406
     }
405 407
 
... ...
@@ -473,6 +479,8 @@ int upx_inflate2e(const char *src, uint32_t ssize, char *dst, uint32_t *dsize, u
473 473
     for(;;) {
474 474
       if ( (oob = doubleebx(src, &myebx, &scur, ssize)) == -1 )
475 475
         return -1;
476
+      if (backbytes >= (INT_MAX / 2) + oob)
477
+	      return -1;
476 478
       backbytes = backbytes*2+oob;
477 479
       if ( (oob = doubleebx(src, &myebx, &scur, ssize)) == -1 )
478 480
         return -1;
... ...
@@ -481,6 +489,8 @@ int upx_inflate2e(const char *src, uint32_t ssize, char *dst, uint32_t *dsize, u
481 481
       backbytes--;
482 482
       if ( (oob = doubleebx(src, &myebx, &scur, ssize)) == -1 )
483 483
         return -1;
484
+      if (backbytes >= (INT_MAX / 2) + oob)
485
+	      return -1;
484 486
       backbytes=backbytes*2+oob;
485 487
     }
486 488