@@ -1499,15 +1499,20 @@ static int msi_hash_dir(MSI_FILE *msi, MSI_DIRENT *dirent, BIO *hash, int is_roo
1499
1499
return ret ;
1500
1500
}
1501
1501
1502
- static void ministream_append (MSI_OUT * out , char * buf , uint32_t len )
1502
+ static int ministream_append (MSI_OUT * out , char * buf , uint32_t len )
1503
1503
{
1504
1504
uint32_t needSectors = (len + out -> sectorSize - 1 ) / out -> sectorSize ;
1505
1505
if (out -> miniStreamLen + len >= (uint64_t )out -> ministreamsMemallocCount * out -> sectorSize ) {
1506
1506
out -> ministreamsMemallocCount += needSectors ;
1507
1507
out -> ministream = OPENSSL_realloc (out -> ministream , (size_t )(out -> ministreamsMemallocCount * out -> sectorSize ));
1508
+ if (!out -> ministream ) {
1509
+ printf ("Memory allocation failure\n" );
1510
+ return 0 ; /* FAILED */
1511
+ }
1508
1512
}
1509
1513
memcpy (out -> ministream + out -> miniStreamLen , buf , (size_t )len );
1510
1514
out -> miniStreamLen += len ;
1515
+ return 1 ; /* OK */
1511
1516
}
1512
1517
1513
1518
static int minifat_append (MSI_OUT * out , char * buf , uint32_t len )
@@ -1519,6 +1524,10 @@ static int minifat_append(MSI_OUT *out, char *buf, uint32_t len)
1519
1524
return 0 ; /* FAILED */
1520
1525
}
1521
1526
out -> minifat = OPENSSL_realloc (out -> minifat , (size_t )(out -> minifatMemallocCount * out -> sectorSize ));
1527
+ if (!out -> minifat ) {
1528
+ printf ("Memory allocation failure\n" );
1529
+ return 0 ; /* FAILED */
1530
+ }
1522
1531
}
1523
1532
memcpy (out -> minifat + out -> minifatLen , buf , (size_t )len );
1524
1533
out -> minifatLen += len ;
@@ -1534,6 +1543,10 @@ static int fat_append(MSI_OUT *out, char *buf, uint32_t len)
1534
1543
return 0 ; /* FAILED */
1535
1544
}
1536
1545
out -> fat = OPENSSL_realloc (out -> fat , (size_t )(out -> fatMemallocCount * out -> sectorSize ));
1546
+ if (!out -> fat ) {
1547
+ printf ("Memory allocation failure\n" );
1548
+ return 0 ; /* FAILED */
1549
+ }
1537
1550
}
1538
1551
memcpy (out -> fat + out -> fatLen , buf , (size_t )len );
1539
1552
out -> fatLen += len ;
@@ -1549,6 +1562,10 @@ static int difat_append(MSI_OUT *out, char *buf, uint32_t len)
1549
1562
return 0 ; /* FAILED */
1550
1563
}
1551
1564
out -> difat = OPENSSL_realloc (out -> difat , (size_t )(out -> difatMemallocCount * out -> sectorSize ));
1565
+ if (!out -> difat ) {
1566
+ printf ("Memory allocation failure\n" );
1567
+ return 0 ; /* FAILED */
1568
+ }
1552
1569
}
1553
1570
memcpy (out -> difat + out -> difatLen , buf , (size_t )len );
1554
1571
out -> difatLen += len ;
@@ -1696,12 +1713,18 @@ static int stream_handle(MSI_FILE *msi, MSI_DIRENT *dirent, u_char *p_msi, uint3
1696
1713
if (inlen < MINI_STREAM_CUTOFF_SIZE ) {
1697
1714
/* set the index into the mini FAT to track the chain of sectors through the mini stream */
1698
1715
child -> entry -> startSectorLocation = out -> miniSectorNum ;
1699
- ministream_append (out , indata , inlen );
1716
+ if (!ministream_append (out , indata , inlen )) {
1717
+ OPENSSL_free (indata );
1718
+ return 0 ; /* FAILED */
1719
+ }
1700
1720
/* fill to the end with known data, such as all zeroes */
1701
1721
if (inlen % msi -> m_minisectorSize > 0 ) {
1702
1722
uint32_t remain = msi -> m_minisectorSize - inlen % msi -> m_minisectorSize ;
1703
1723
memset (buf , 0 , (size_t )remain );
1704
- ministream_append (out , buf , remain );
1724
+ if (!ministream_append (out , buf , remain )) {
1725
+ OPENSSL_free (indata );
1726
+ return 0 ; /* FAILED */
1727
+ }
1705
1728
}
1706
1729
while (inlen > msi -> m_minisectorSize ) {
1707
1730
out -> miniSectorNum ++ ;
0 commit comments