1*86ee64e7SAndroid Build Coastguard Workercommit c8834821f452a3d424edd0ed2a1e9ceeda38d0ea 2*86ee64e7SAndroid Build Coastguard WorkerAuthor: Alex Danilo <[email protected]> 3*86ee64e7SAndroid Build Coastguard WorkerDate: Thu May 12 03:29:52 2022 +0000 4*86ee64e7SAndroid Build Coastguard Worker 5*86ee64e7SAndroid Build Coastguard Worker Extract: Parse Unicode Path Extra field in minizip 6*86ee64e7SAndroid Build Coastguard Worker 7*86ee64e7SAndroid Build Coastguard Worker Adds parsing of the Info-ZIP Extra field which overrides the 8*86ee64e7SAndroid Build Coastguard Worker file name in the File Header only if the CRC in the extra field 9*86ee64e7SAndroid Build Coastguard Worker is a CRC of the file name in the File Header. 10*86ee64e7SAndroid Build Coastguard Worker 11*86ee64e7SAndroid Build Coastguard Worker See https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT 12*86ee64e7SAndroid Build Coastguard Worker section 4.6.9 for reference. 13*86ee64e7SAndroid Build Coastguard Worker 14*86ee64e7SAndroid Build Coastguard Worker Also tidied up some whitespace indent. 15*86ee64e7SAndroid Build Coastguard Worker 16*86ee64e7SAndroid Build Coastguard Worker Bug: 953256, 953599 17*86ee64e7SAndroid Build Coastguard Worker Tests: Manually tested, auto test in follow on CL 18*86ee64e7SAndroid Build Coastguard Worker Change-Id: I1283dcb88a203c3bb56c1d9c504035a2e51aecbd 19*86ee64e7SAndroid Build Coastguard Worker Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3641742 20*86ee64e7SAndroid Build Coastguard Worker Reviewed-by: Noel Gordon <[email protected]> 21*86ee64e7SAndroid Build Coastguard Worker Commit-Queue: Alex Danilo <[email protected]> 22*86ee64e7SAndroid Build Coastguard Worker Cr-Commit-Position: refs/heads/main@{#1002476} 23*86ee64e7SAndroid Build Coastguard Worker 24*86ee64e7SAndroid Build Coastguard Workerdiff --git a/third_party/zlib/contrib/minizip/unzip.c b/third_party/zlib/contrib/minizip/unzip.c 25*86ee64e7SAndroid Build Coastguard Workerindex c8a01b23efd42..42677cff82c96 100644 26*86ee64e7SAndroid Build Coastguard Worker--- a/third_party/zlib/contrib/minizip/unzip.c 27*86ee64e7SAndroid Build Coastguard Worker+++ b/third_party/zlib/contrib/minizip/unzip.c 28*86ee64e7SAndroid Build Coastguard Worker@@ -193,6 +193,26 @@ typedef struct 29*86ee64e7SAndroid Build Coastguard Worker Reads a long in LSB order from the given gz_stream. Sets 30*86ee64e7SAndroid Build Coastguard Worker */ 31*86ee64e7SAndroid Build Coastguard Worker 32*86ee64e7SAndroid Build Coastguard Worker+local int unz64local_getByte(const zlib_filefunc64_32_def* pzlib_filefunc_def, 33*86ee64e7SAndroid Build Coastguard Worker+ voidpf filestream, 34*86ee64e7SAndroid Build Coastguard Worker+ int *pi) { 35*86ee64e7SAndroid Build Coastguard Worker+ unsigned char c; 36*86ee64e7SAndroid Build Coastguard Worker+ int err = (int)ZREAD64(*pzlib_filefunc_def,filestream,&c,1); 37*86ee64e7SAndroid Build Coastguard Worker+ if (err==1) 38*86ee64e7SAndroid Build Coastguard Worker+ { 39*86ee64e7SAndroid Build Coastguard Worker+ *pi = (int)c; 40*86ee64e7SAndroid Build Coastguard Worker+ return UNZ_OK; 41*86ee64e7SAndroid Build Coastguard Worker+ } 42*86ee64e7SAndroid Build Coastguard Worker+ else 43*86ee64e7SAndroid Build Coastguard Worker+ { 44*86ee64e7SAndroid Build Coastguard Worker+ *pi = 0; 45*86ee64e7SAndroid Build Coastguard Worker+ if (ZERROR64(*pzlib_filefunc_def,filestream)) 46*86ee64e7SAndroid Build Coastguard Worker+ return UNZ_ERRNO; 47*86ee64e7SAndroid Build Coastguard Worker+ else 48*86ee64e7SAndroid Build Coastguard Worker+ return UNZ_EOF; 49*86ee64e7SAndroid Build Coastguard Worker+ } 50*86ee64e7SAndroid Build Coastguard Worker+} 51*86ee64e7SAndroid Build Coastguard Worker+ 52*86ee64e7SAndroid Build Coastguard Worker local int unz64local_getShort(const zlib_filefunc64_32_def* pzlib_filefunc_def, 53*86ee64e7SAndroid Build Coastguard Worker voidpf filestream, 54*86ee64e7SAndroid Build Coastguard Worker uLong *pX) { 55*86ee64e7SAndroid Build Coastguard Worker@@ -948,6 +968,62 @@ local int unz64local_GetCurrentFileInfoInternal(unzFile file, 56*86ee64e7SAndroid Build Coastguard Worker } 57*86ee64e7SAndroid Build Coastguard Worker 58*86ee64e7SAndroid Build Coastguard Worker } 59*86ee64e7SAndroid Build Coastguard Worker+ else if (headerId == 0x7075) /* Info-ZIP Unicode Path Extra Field */ 60*86ee64e7SAndroid Build Coastguard Worker+ { 61*86ee64e7SAndroid Build Coastguard Worker+ int version = 0; 62*86ee64e7SAndroid Build Coastguard Worker+ 63*86ee64e7SAndroid Build Coastguard Worker+ if (unz64local_getByte(&s->z_filefunc, s->filestream, &version) != UNZ_OK) 64*86ee64e7SAndroid Build Coastguard Worker+ { 65*86ee64e7SAndroid Build Coastguard Worker+ err = UNZ_ERRNO; 66*86ee64e7SAndroid Build Coastguard Worker+ } 67*86ee64e7SAndroid Build Coastguard Worker+ if (version != 1) 68*86ee64e7SAndroid Build Coastguard Worker+ { 69*86ee64e7SAndroid Build Coastguard Worker+ if (ZSEEK64(s->z_filefunc, s->filestream,dataSize - 1, ZLIB_FILEFUNC_SEEK_CUR) != 0) 70*86ee64e7SAndroid Build Coastguard Worker+ { 71*86ee64e7SAndroid Build Coastguard Worker+ err = UNZ_ERRNO; 72*86ee64e7SAndroid Build Coastguard Worker+ } 73*86ee64e7SAndroid Build Coastguard Worker+ } 74*86ee64e7SAndroid Build Coastguard Worker+ else 75*86ee64e7SAndroid Build Coastguard Worker+ { 76*86ee64e7SAndroid Build Coastguard Worker+ uLong uCrc, uHeaderCrc, fileNameSize; 77*86ee64e7SAndroid Build Coastguard Worker+ 78*86ee64e7SAndroid Build Coastguard Worker+ if (unz64local_getLong(&s->z_filefunc, s->filestream, &uCrc) != UNZ_OK) 79*86ee64e7SAndroid Build Coastguard Worker+ { 80*86ee64e7SAndroid Build Coastguard Worker+ err = UNZ_ERRNO; 81*86ee64e7SAndroid Build Coastguard Worker+ } 82*86ee64e7SAndroid Build Coastguard Worker+ uHeaderCrc = crc32(0, (const unsigned char *)szFileName, file_info.size_filename); 83*86ee64e7SAndroid Build Coastguard Worker+ fileNameSize = dataSize - (2 * sizeof (short) + 1); 84*86ee64e7SAndroid Build Coastguard Worker+ /* Check CRC against file name in the header. */ 85*86ee64e7SAndroid Build Coastguard Worker+ if (uHeaderCrc != uCrc) 86*86ee64e7SAndroid Build Coastguard Worker+ { 87*86ee64e7SAndroid Build Coastguard Worker+ if (ZSEEK64(s->z_filefunc, s->filestream, fileNameSize, ZLIB_FILEFUNC_SEEK_CUR) != 0) 88*86ee64e7SAndroid Build Coastguard Worker+ { 89*86ee64e7SAndroid Build Coastguard Worker+ err = UNZ_ERRNO; 90*86ee64e7SAndroid Build Coastguard Worker+ } 91*86ee64e7SAndroid Build Coastguard Worker+ } 92*86ee64e7SAndroid Build Coastguard Worker+ else 93*86ee64e7SAndroid Build Coastguard Worker+ { 94*86ee64e7SAndroid Build Coastguard Worker+ uLong uSizeRead; 95*86ee64e7SAndroid Build Coastguard Worker+ 96*86ee64e7SAndroid Build Coastguard Worker+ if (fileNameSize < fileNameBufferSize) 97*86ee64e7SAndroid Build Coastguard Worker+ { 98*86ee64e7SAndroid Build Coastguard Worker+ *(szFileName + fileNameSize) = '\0'; 99*86ee64e7SAndroid Build Coastguard Worker+ uSizeRead = fileNameSize; 100*86ee64e7SAndroid Build Coastguard Worker+ } 101*86ee64e7SAndroid Build Coastguard Worker+ else 102*86ee64e7SAndroid Build Coastguard Worker+ { 103*86ee64e7SAndroid Build Coastguard Worker+ uSizeRead = fileNameBufferSize; 104*86ee64e7SAndroid Build Coastguard Worker+ } 105*86ee64e7SAndroid Build Coastguard Worker+ if ((fileNameSize > 0) && (fileNameBufferSize > 0)) 106*86ee64e7SAndroid Build Coastguard Worker+ { 107*86ee64e7SAndroid Build Coastguard Worker+ if (ZREAD64(s->z_filefunc, s->filestream, szFileName, uSizeRead) != uSizeRead) 108*86ee64e7SAndroid Build Coastguard Worker+ { 109*86ee64e7SAndroid Build Coastguard Worker+ err = UNZ_ERRNO; 110*86ee64e7SAndroid Build Coastguard Worker+ } 111*86ee64e7SAndroid Build Coastguard Worker+ } 112*86ee64e7SAndroid Build Coastguard Worker+ } 113*86ee64e7SAndroid Build Coastguard Worker+ } 114*86ee64e7SAndroid Build Coastguard Worker+ } 115*86ee64e7SAndroid Build Coastguard Worker else 116*86ee64e7SAndroid Build Coastguard Worker { 117*86ee64e7SAndroid Build Coastguard Worker if (ZSEEK64(s->z_filefunc, s->filestream,dataSize,ZLIB_FILEFUNC_SEEK_CUR)!=0) 118