@@ -186,13 +186,16 @@ typedef struct {
186
186
char * ministream ;
187
187
char * minifat ;
188
188
char * fat ;
189
+ char * difat ;
189
190
uint32_t dirtreeLen ;
190
191
uint32_t miniStreamLen ;
191
192
uint32_t minifatLen ;
192
193
uint32_t fatLen ;
194
+ uint32_t difatLen ;
193
195
uint32_t ministreamsMemallocCount ;
194
196
uint32_t minifatMemallocCount ;
195
197
uint32_t fatMemallocCount ;
198
+ uint32_t difatMemallocCount ;
196
199
uint32_t dirtreeSectorsCount ;
197
200
uint32_t minifatSectorsCount ;
198
201
uint32_t fatSectorsCount ;
@@ -1542,6 +1545,16 @@ static void fat_append(MSI_OUT *out, char *buf, uint32_t len)
1542
1545
out -> fatLen += len ;
1543
1546
}
1544
1547
1548
+ static void difat_append (MSI_OUT * out , char * buf , uint32_t len )
1549
+ {
1550
+ if (out -> difatLen == (uint64_t )out -> difatMemallocCount * out -> sectorSize ) {
1551
+ out -> difatMemallocCount += 1 ;
1552
+ out -> difat = OPENSSL_realloc (out -> difat , (size_t )(out -> difatMemallocCount * out -> sectorSize ));
1553
+ }
1554
+ memcpy (out -> difat + out -> difatLen , buf , (size_t )len );
1555
+ out -> difatLen += len ;
1556
+ }
1557
+
1545
1558
static int msi_dirent_delete (MSI_DIRENT * dirent , const u_char * name , uint16_t nameLen )
1546
1559
{
1547
1560
int i ;
@@ -1938,15 +1951,6 @@ static void dirtree_save(MSI_DIRENT *dirent, BIO *outdata, MSI_OUT *out)
1938
1951
out -> sectorNum += out -> dirtreeSectorsCount ;
1939
1952
}
1940
1953
1941
- static void fat_pad_last_sector (MSI_OUT * out , int padValue , char * buf )
1942
- {
1943
- if (out -> fatLen % out -> sectorSize > 0 ) {
1944
- uint32_t remain = out -> sectorSize - out -> fatLen % out -> sectorSize ;
1945
- memset (buf , padValue , (size_t )remain );
1946
- fat_append (out , buf , remain );
1947
- }
1948
- }
1949
-
1950
1954
static int fat_save (BIO * outdata , MSI_OUT * out )
1951
1955
{
1952
1956
char buf [MAX_SECTOR_SIZE ];
@@ -1955,8 +1959,6 @@ static int fat_save(BIO *outdata, MSI_OUT *out)
1955
1959
remain = (out -> fatLen + out -> sectorSize - 1 ) / out -> sectorSize ;
1956
1960
out -> fatSectorsCount = (out -> fatLen + remain * 4 + out -> sectorSize - 1 ) / out -> sectorSize ;
1957
1961
1958
- fat_pad_last_sector (out , 0 , buf );
1959
-
1960
1962
if (out -> fatSectorsCount > DIFAT_IN_HEADER ) {
1961
1963
difatEntriesPerSector = (out -> sectorSize / 4 ) - 1 ;
1962
1964
difatSectors = (out -> fatSectorsCount - DIFAT_IN_HEADER + difatEntriesPerSector - 1 ) / difatEntriesPerSector ;
@@ -2001,7 +2003,7 @@ static int fat_save(BIO *outdata, MSI_OUT *out)
2001
2003
PUT_UINT32_LE (out -> sectorNum + 1 , buf + out -> sectorSize - 4 );
2002
2004
}
2003
2005
2004
- fat_append (out , buf , out -> sectorSize );
2006
+ difat_append (out , buf , out -> sectorSize );
2005
2007
out -> sectorNum ++ ;
2006
2008
}
2007
2009
}
@@ -2019,9 +2021,14 @@ static int fat_save(BIO *outdata, MSI_OUT *out)
2019
2021
}
2020
2022
2021
2023
/* empty unallocated free sectors in the last FAT sector */
2022
- fat_pad_last_sector (out , (int )FREESECT , buf );
2024
+ if (out -> fatLen % out -> sectorSize > 0 ) {
2025
+ remain = out -> sectorSize - out -> fatLen % out -> sectorSize ;
2026
+ memset (buf , (int )FREESECT , (size_t )remain );
2027
+ fat_append (out , buf , remain );
2028
+ }
2023
2029
2024
2030
BIO_write (outdata , out -> fat , (int )out -> fatLen );
2031
+ BIO_write (outdata , out -> difat , (int )out -> difatLen );
2025
2032
return 1 ; /* OK */
2026
2033
}
2027
2034
0 commit comments