1
0
mirror of https://github.com/mtrojnar/osslsigncode.git synced 2025-04-09 10:38:05 -05:00

Fix memory management for ministream and difat in MSI output, CID 1639166

This commit is contained in:
olszomal 2025-03-31 10:09:19 +02:00 committed by Michał Trojnara
parent 838aaaee8d
commit 776e2ec7b6

5
msi.c

@ -1785,7 +1785,6 @@ static int ministream_save(MSI_DIRENT *dirent, BIO *outdata, MSI_OUT *out)
dirent->entry->startSectorLocation = out->sectorNum; dirent->entry->startSectorLocation = out->sectorNum;
/* ministream save */ /* ministream save */
BIO_write(outdata, out->ministream, (int)out->miniStreamLen); BIO_write(outdata, out->ministream, (int)out->miniStreamLen);
OPENSSL_free(out->ministream);
/* fill to the end with known data, such as all zeroes */ /* fill to the end with known data, such as all zeroes */
if (out->miniStreamLen % out->sectorSize > 0) { if (out->miniStreamLen % out->sectorSize > 0) {
remain = out->sectorSize - out->miniStreamLen % out->sectorSize; remain = out->sectorSize - out->miniStreamLen % out->sectorSize;
@ -2186,6 +2185,8 @@ static int msiout_set(MSI_FILE *msi, uint32_t len_msi, uint32_t len_msiex, MSI_O
out->header = header_new(msi->m_hdr, out); out->header = header_new(msi->m_hdr, out);
out->minifatMemallocCount = msi->m_hdr->numMiniFATSector; out->minifatMemallocCount = msi->m_hdr->numMiniFATSector;
out->fatMemallocCount = msi->m_hdr->numFATSector; out->fatMemallocCount = msi->m_hdr->numFATSector;
out->difatMemallocCount = 0;
out->difat = NULL;
out->ministream = NULL; out->ministream = NULL;
out->minifat = OPENSSL_malloc((uint64_t)out->minifatMemallocCount * out->sectorSize); out->minifat = OPENSSL_malloc((uint64_t)out->minifatMemallocCount * out->sectorSize);
out->fat = OPENSSL_malloc((uint64_t)out->fatMemallocCount * out->sectorSize); out->fat = OPENSSL_malloc((uint64_t)out->fatMemallocCount * out->sectorSize);
@ -2226,7 +2227,9 @@ static int msi_file_write(MSI_FILE *msi, MSI_DIRENT *dirent, u_char *p_msi, uint
out: out:
OPENSSL_free(out.header); OPENSSL_free(out.header);
OPENSSL_free(out.fat); OPENSSL_free(out.fat);
OPENSSL_free(out.difat);
OPENSSL_free(out.minifat); OPENSSL_free(out.minifat);
OPENSSL_free(out.ministream);
return ret; return ret;
} }