Skip to content

Commit 3c8c74a

Browse files
olszomalmtrojnar
authored andcommitted
Handled memory reallocation error
1 parent 771014a commit 3c8c74a

File tree

1 file changed

+26
-3
lines changed

1 file changed

+26
-3
lines changed

msi.c

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1499,15 +1499,20 @@ static int msi_hash_dir(MSI_FILE *msi, MSI_DIRENT *dirent, BIO *hash, int is_roo
14991499
return ret;
15001500
}
15011501

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)
15031503
{
15041504
uint32_t needSectors = (len + out->sectorSize - 1) / out->sectorSize;
15051505
if (out->miniStreamLen + len >= (uint64_t)out->ministreamsMemallocCount * out->sectorSize) {
15061506
out->ministreamsMemallocCount += needSectors;
15071507
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+
}
15081512
}
15091513
memcpy(out->ministream + out->miniStreamLen, buf, (size_t)len);
15101514
out->miniStreamLen += len;
1515+
return 1; /* OK */
15111516
}
15121517

15131518
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)
15191524
return 0; /* FAILED */
15201525
}
15211526
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+
}
15221531
}
15231532
memcpy(out->minifat + out->minifatLen, buf, (size_t)len);
15241533
out->minifatLen += len;
@@ -1534,6 +1543,10 @@ static int fat_append(MSI_OUT *out, char *buf, uint32_t len)
15341543
return 0; /* FAILED */
15351544
}
15361545
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+
}
15371550
}
15381551
memcpy(out->fat + out->fatLen, buf, (size_t)len);
15391552
out->fatLen += len;
@@ -1549,6 +1562,10 @@ static int difat_append(MSI_OUT *out, char *buf, uint32_t len)
15491562
return 0; /* FAILED */
15501563
}
15511564
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+
}
15521569
}
15531570
memcpy(out->difat + out->difatLen, buf, (size_t)len);
15541571
out->difatLen += len;
@@ -1696,12 +1713,18 @@ static int stream_handle(MSI_FILE *msi, MSI_DIRENT *dirent, u_char *p_msi, uint3
16961713
if (inlen < MINI_STREAM_CUTOFF_SIZE) {
16971714
/* set the index into the mini FAT to track the chain of sectors through the mini stream */
16981715
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+
}
17001720
/* fill to the end with known data, such as all zeroes */
17011721
if (inlen % msi->m_minisectorSize > 0) {
17021722
uint32_t remain = msi->m_minisectorSize - inlen % msi->m_minisectorSize;
17031723
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+
}
17051728
}
17061729
while (inlen > msi->m_minisectorSize) {
17071730
out->miniSectorNum++;

0 commit comments

Comments
 (0)