X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flibpspp%2Fzip-reader.c;h=7c1e342aa76e51bb513afa1e72cf01d9bf41e7d0;hb=300b8be9a0ce46e5dae3895b99bc8d54eaf6edfb;hp=bee7e2f240ff2affad679c5a50f1bef916d638a6;hpb=551202adbc334f9c33f8290a4e407b422651bbd5;p=pspp diff --git a/src/libpspp/zip-reader.c b/src/libpspp/zip-reader.c index bee7e2f240..7c1e342aa7 100644 --- a/src/libpspp/zip-reader.c +++ b/src/libpspp/zip-reader.c @@ -26,6 +26,7 @@ #include #include +#include #include #include "inflate.h" @@ -160,9 +161,28 @@ get_bytes (FILE *f, void *x, size_t n) /* Read a 32 bit value from F */ static void -get_u32 (FILE *f, uint32_t *x) +get_u32 (FILE *f, uint32_t *v) { - get_bytes (f, x, sizeof *x); + uint32_t x; + get_bytes (f, &x, sizeof x); +#ifdef WORDS_BIGENDIAN + *v = bswap_32 (x); +#else + *v = x; +#endif +} + +/* Read a 16 bit value from F */ +static void +get_u16 (FILE *f, uint16_t *v) +{ + uint16_t x; + get_bytes (f, &x, sizeof x); +#ifdef WORDS_BIGENDIAN + *v = bswap_16 (x); +#else + *v = x; +#endif } @@ -187,13 +207,6 @@ check_magic (FILE *f, uint32_t expected, struct string *err) } -/* Read a 16 bit value from F */ -static void -get_u16 (FILE *f, uint16_t *x) -{ - get_bytes (f, x, sizeof *x); -} - /* Reads upto BYTES bytes from ZM and puts them in BUF. Returns the number of bytes read, or -1 on error */ int @@ -262,7 +275,7 @@ zip_header_read_next (struct zip_reader *zr) get_u32 (zr->fr, &eattr); get_u32 (zr->fr, &zm->offset); - zm->name = calloc (nlen + 1, 1); + zm->name = xzalloc (nlen + 1); get_bytes (zr->fr, zm->name, nlen); skip_bytes (zr->fr, extralen); @@ -285,7 +298,7 @@ zip_reader_create (const char *filename, struct string *errs) off_t offset = 0; uint32_t central_dir_start, central_dir_length; - struct zip_reader *zr = malloc (sizeof *zr); + struct zip_reader *zr = xzalloc (sizeof *zr); zr->errs = errs; if ( zr->errs) ds_init_empty (zr->errs); @@ -350,7 +363,8 @@ zip_reader_create (const char *filename, struct string *errs) return NULL; } - zr->members = calloc (zr->n_members, sizeof (*zr->members)); + zr->members = xcalloc (zr->n_members, sizeof (*zr->members)); + memset (zr->members, 0, zr->n_members * sizeof (*zr->members)); zr->filename = strdup (filename); @@ -368,7 +382,7 @@ zip_member_open (struct zip_reader *zr, const char *member) uint32_t ucomp_size, comp_size; uint32_t crc; - + bool new_member = false; char *name = NULL; int i; @@ -377,17 +391,19 @@ zip_member_open (struct zip_reader *zr, const char *member) if ( zr == NULL) return NULL; - for (i = 0 ; i < zr->n_members; ++i) + for (i = 0; i < zr->n_members; ++i) { - zm = zr->members[i] = zip_header_read_next (zr); - if (zm && 0 == strcmp (zm->name, member)) + zm = zr->members[i]; + + if (zm == NULL) { - break; + zm = zr->members[i] = zip_header_read_next (zr); + new_member = true; } + if (zm && 0 == strcmp (zm->name, member)) + break; else - { - zm = NULL; - } + zm = NULL; } if ( zm == NULL) @@ -418,7 +434,7 @@ zip_member_open (struct zip_reader *zr, const char *member) get_u16 (zm->fp, &nlen); get_u16 (zm->fp, &extra_len); - name = calloc (nlen + 1, sizeof (char)); + name = xzalloc (nlen + 1); get_bytes (zm->fp, name, nlen); @@ -437,8 +453,11 @@ zip_member_open (struct zip_reader *zr, const char *member) free (name); zm->bytes_unread = zm->ucomp_size; + + if ( !new_member) + decompressors[zm->compression].finish (zm); - if ( ! decompressors[zm->compression].init (zm) ) + if (!decompressors[zm->compression].init (zm) ) return NULL; return zm;