xref: /aosp_15_r20/external/zlib/patches/0016-minizip-parse-unicode-path-extra-field.patch (revision 86ee64e75fa5f8bce2c8c356138035642429cd05)
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