(...)

#define UMAX_ENTRY        ARCHIVE_LITERAL_ULL(100000000)

(...)

Line 2129        static int

Line 2130        read_SubStreamsInfo(struct archive_read *a, struct _7z_substream_info *ss,

Line 2131                struct _7z_folder *f, size_t numFolders)

Line 2132        {

Line 2133                const unsigned char *p;

Line 2134                uint64_t *usizes;

Line 2135                size_t unpack_streams;

Line 2136                int type;

Line 2137                unsigned i;

Line 2138                uint32_t numDigests;

(...)

Line 2149        if (type == kNumUnPackStream) {

Line 2150                unpack_streams = 0;

Line 2151                for (i = 0; i < numFolders; i++) {

Line 2152                        if (parse_7zip_uint64(a, &(f[i].numUnpackStreams)) < 0)

Line 2153                                return (-1);

Line 2154                        if (UMAX_ENTRY < f[i].numUnpackStreams)

Line 2155                                return (-1);

Line 2156                        unpack_streams += (size_t)f[i].numUnpackStreams;

^^^^^^^^^  ---- INTEGER OVERFLOW

Line 2157                }

Line 2158                if ((p = header_bytes(a, 1)) == NULL)

Line 2159                        return (-1);

Line 2160                type = *p;

Line 2161        } else

Line 2162                unpack_streams = numFolders;

Line 2163

Line 2164        ss->unpack_streams = unpack_streams;

Line 2165        if (unpack_streams) {

Line 2166                ss->unpackSizes = calloc(unpack_streams,

^^^^^^^^^  ---- ALLOCATION BASED ON OVERFLOWED INT

Line 2167                    sizeof(*ss->unpackSizes));

Line 2168                ss->digestsDefined = calloc(unpack_streams,

Line 2169                    sizeof(*ss->digestsDefined));

Line 2170                ss->digests = calloc(unpack_streams,

Line 2171                    sizeof(*ss->digests));

Line 2172                if (ss->unpackSizes == NULL || ss->digestsDefined == NULL ||

Line 2173                    ss->digests == NULL)

Line 2174                        return (-1);

Line 2175        }

Line 2176

Line 2177        usizes = ss->unpackSizes;

Line 2178        for (i = 0; i < numFolders; i++) {

Line 2179                unsigned pack;

Line 2180                uint64_t sum;

Line 2181

Line 2182                if (f[i].numUnpackStreams == 0)

Line 2183                        continue;

Line 2184

Line 2185                sum = 0;

Line 2186                if (type == kSize) {

Line 2187                        for (pack = 1; pack < f[i].numUnpackStreams; pack++) {

Line 2188                                if (parse_7zip_uint64(a, usizes) < 0)                         ^^^^^^^^^  ---- BUFFER OVERFLOW

Line 2189                                        return (-1);

Line 2190                                sum += *usizes++;

Line 2191                        }

Line 2192                }

Line 2193                *usizes++ = folder_uncompressed_size(&f[i]) - sum;

Line 2194        }

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐