struct _7z_folder {
uint64_t numCoders;
struct _7z_coder {
- unsigned long codec;
+ uint64_t codec;
uint64_t numInStreams;
uint64_t numOutStreams;
uint64_t propertiesSize;
static int archive_read_format_7zip_read_header(struct archive_read *,
struct archive_entry *);
static int check_7zip_header_in_sfx(const unsigned char *);
-static unsigned long decode_codec_id(const unsigned char *, size_t);
+static int decode_codec_id(const unsigned char *, size_t, uint64_t *);
static int decode_encoded_header_info(struct archive_read *,
struct _7z_stream_info *);
static int decompress(struct archive_read *, struct _7zip *,
#endif
-static unsigned long
-decode_codec_id(const unsigned char *codecId, size_t id_size)
+static int
+decode_codec_id(const unsigned char *codecId, size_t id_size, uint64_t *id)
{
unsigned i;
- unsigned long id = 0;
+ uint64_t v = 0;
for (i = 0; i < id_size; i++) {
- id <<= 8;
- id += codecId[i];
+ if (v > (uint64_t)INT64_MAX / 256)
+ return (-1);
+ v <<= 8;
+ v += codecId[i];
}
- return (id);
+ *id = v;
+ return (0);
}
static Byte
if ((p = header_bytes(a, codec_size)) == NULL)
return (-1);
- f->coders[i].codec = decode_codec_id(p, codec_size);
+ if (decode_codec_id(p, codec_size, &f->coders[i].codec) < 0)
+ return (-1);
if (simple) {
f->coders[i].numInStreams = 1;