Next step of API cleanup: no size_t, no int as file index. --HG-- branch : HEAD
diff --git a/lib/make_zipconf.sh b/lib/make_zipconf.sh index 05bde12..a089308 100644 --- a/lib/make_zipconf.sh +++ b/lib/make_zipconf.sh
@@ -1,7 +1,7 @@ #!/bin/sh # make_zipconf.sh: create platform specific include file zipconf.h -# Copyright (C) 1999-2008 Dieter Baron and Thomas Klausner +# Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner # # This file is part of libzip, a library to manipulate ZIP archives. # The authors can be contacted at <libzip@nih.at> @@ -43,19 +43,26 @@ outfile="$5" bits=`expr $bytes '*' 8` - type="${short}int${bits}_t" + type="${short}int${bits}" TYPE=`echo $type | tr a-z A-Z` - if grep -q "define HAVE_${TYPE}" "$infile" + if grep -q "define HAVE_${TYPE}_T" "$infile" then - echo "typedef $type zip_$type;" >> "$outfile" + echo "typedef ${type}_t zip_${type}_t;" >> "$outfile" + LTYPE="$TYPE" else + SHORT=`echo $short | tr a-z A-Z` + if [ -z "$SHORT" ] + then + SHORT='S' + fi if [ "$bytes" -eq 1 ] then if [ -z "$long" ] then long='signed' fi - echo "typedef $long char $type;" >> $outfile + echo "typedef $long char ${type}_t;" >> $outfile + LTYPE="${SHORT}CHAR" else ctype=`sed -n "s/.define SIZEOF_\([A-Z_]*\) $bytes/\1/p" "$infile" \ | head -1 | tr A-Z_ 'a-z '` @@ -64,9 +71,22 @@ echo "$0: no $bits bit type found" >&2 exit 1 fi - echo "typedef $long $ctype $type;" >> $outfile + echo "typedef $long $ctype ${type}_t;" >> "$outfile" + case "$ctype" in + short) LTYPE=${SHORT}SHRT;; + int) LTYPE=${SHORT}INT;; + long) LTYPE=${SHORT}LONG;; + "long long") LTYPE=${SHORT}LLONG;; + esac fi fi + + if [ -z "$long" ] + then + echo "#define ZIP_${TYPE}_MIN ${LTYPE}_MIN" >> "$outfile" + fi + echo "#define ZIP_${TYPE}_MAX ${LTYPE}_MAX" >> "$outfile" + echo >> "$outfile" } @@ -99,8 +119,10 @@ if grep -q 'define HAVE_INTTYPES_H' "$1" then echo '#include <inttypes.h>' >> "$2.$$" - echo >> "$2.$$" +else + echo '#include <limits.h>' >> "$2.$$" fi +echo >> "$2.$$" for size in 1 2 4 8 do
diff --git a/lib/zip.h b/lib/zip.h index 66886e1..26350d9 100644 --- a/lib/zip.h +++ b/lib/zip.h
@@ -173,7 +173,7 @@ struct zip_stat { const char *name; /* name of the file */ - int index; /* index within archive */ + zip_uint64_t index; /* index within archive */ zip_uint32_t crc; /* crc of file data */ time_t mtime; /* modification time */ zip_uint64_t size; /* size of file (uncompressed) */ @@ -186,8 +186,8 @@ struct zip_file; struct zip_source; -typedef ssize_t (*zip_source_callback)(void *state, void *data, - size_t len, enum zip_source_cmd cmd); +typedef zip_int64_t (*zip_source_callback)(void *, void *, zip_uint64_t, + enum zip_source_cmd); typedef struct zip_source *(*zip_compression_implementation)(struct zip *, struct zip_source *, zip_uint16_t, int); @@ -198,14 +198,14 @@ -ZIP_EXTERN int zip_add(struct zip *, const char *, struct zip_source *); -ZIP_EXTERN int zip_add_dir(struct zip *, const char *); +ZIP_EXTERN zip_int64_t zip_add(struct zip *, const char *, struct zip_source *); +ZIP_EXTERN zip_int64_t zip_add_dir(struct zip *, const char *); ZIP_EXTERN int zip_close(struct zip *); -ZIP_EXTERN int zip_delete(struct zip *, int); +ZIP_EXTERN int zip_delete(struct zip *, zip_uint64_t); ZIP_EXTERN void zip_error_clear(struct zip *); ZIP_EXTERN void zip_error_get(struct zip *, int *, int *); ZIP_EXTERN int zip_error_get_sys_type(int); -ZIP_EXTERN int zip_error_to_str(char *, size_t, int, int); +ZIP_EXTERN int zip_error_to_str(char *, zip_uint64_t, int, int); ZIP_EXTERN int zip_fclose(struct zip_file *); ZIP_EXTERN struct zip *zip_fdopen(int, int, int *); ZIP_EXTERN void zip_file_error_clear(struct zip_file *); @@ -214,30 +214,33 @@ ZIP_EXTERN struct zip_file *zip_fopen(struct zip *, const char *, int); ZIP_EXTERN struct zip_file *zip_fopen_encrypted(struct zip *, const char *, int, const char *); -ZIP_EXTERN struct zip_file *zip_fopen_index(struct zip *, int, int); -ZIP_EXTERN struct zip_file *zip_fopen_index_encrypted(struct zip *, int, int, +ZIP_EXTERN struct zip_file *zip_fopen_index(struct zip *, zip_uint64_t, int); +ZIP_EXTERN struct zip_file *zip_fopen_index_encrypted(struct zip *, + zip_uint64_t, int, const char *); -ZIP_EXTERN ssize_t zip_fread(struct zip_file *, void *, size_t); +ZIP_EXTERN zip_int64_t zip_fread(struct zip_file *, void *, zip_uint64_t); ZIP_EXTERN const char *zip_get_archive_comment(struct zip *, int *, int); ZIP_EXTERN int zip_get_archive_flag(struct zip *, int, int); ZIP_EXTERN zip_compression_implementation zip_get_compression_implementation( zip_uint16_t); ZIP_EXTERN zip_encryption_implementation zip_get_encryption_implementation( zip_uint16_t); -ZIP_EXTERN const char *zip_get_file_comment(struct zip *, int, int *, int); -ZIP_EXTERN const char *zip_get_name(struct zip *, int, int); +ZIP_EXTERN const char *zip_get_file_comment(struct zip *, zip_uint64_t, + int *, int); +ZIP_EXTERN const char *zip_get_name(struct zip *, zip_uint64_t, int); ZIP_EXTERN int zip_get_num_files(struct zip *); ZIP_EXTERN int zip_name_locate(struct zip *, const char *, int); ZIP_EXTERN struct zip *zip_open(const char *, int, int *); -ZIP_EXTERN int zip_rename(struct zip *, int, const char *); -ZIP_EXTERN int zip_replace(struct zip *, int, struct zip_source *); +ZIP_EXTERN int zip_rename(struct zip *, zip_uint64_t, const char *); +ZIP_EXTERN int zip_replace(struct zip *, zip_uint64_t, struct zip_source *); ZIP_EXTERN int zip_set_archive_comment(struct zip *, const char *, int); ZIP_EXTERN int zip_set_archive_flag(struct zip *, int, int); -ZIP_EXTERN int zip_set_file_comment(struct zip *, int, const char *, int); +ZIP_EXTERN int zip_set_file_comment(struct zip *, zip_uint64_t, + const char *, int); ZIP_EXTERN struct zip_source *zip_source_buffer(struct zip *, const void *, zip_uint64_t, int); -ZIP_EXTERN ssize_t zip_source_call(struct zip_source *, void *, size_t, - enum zip_source_cmd); +ZIP_EXTERN zip_int64_t zip_source_call(struct zip_source *, void *, + zip_uint64_t, enum zip_source_cmd); ZIP_EXTERN struct zip_source *zip_source_deflate(struct zip *, struct zip_source *, zip_uint16_t, int); @@ -253,12 +256,14 @@ zip_uint16_t, int, const char *); ZIP_EXTERN struct zip_source *zip_source_zip(struct zip *, struct zip *, - int, int, zip_uint64_t, zip_int64_t); + zip_uint64_t, int, + zip_uint64_t, zip_int64_t); ZIP_EXTERN int zip_stat(struct zip *, const char *, int, struct zip_stat *); -ZIP_EXTERN int zip_stat_index(struct zip *, int, int, struct zip_stat *); +ZIP_EXTERN int zip_stat_index(struct zip *, zip_uint64_t, int, + struct zip_stat *); ZIP_EXTERN void zip_stat_init(struct zip_stat *); ZIP_EXTERN const char *zip_strerror(struct zip *); -ZIP_EXTERN int zip_unchange(struct zip *, int); +ZIP_EXTERN int zip_unchange(struct zip *, zip_uint64_t); ZIP_EXTERN int zip_unchange_all(struct zip *); ZIP_EXTERN int zip_unchange_archive(struct zip *);
diff --git a/lib/zip_add.c b/lib/zip_add.c index f6bdb2a..6a310a8 100644 --- a/lib/zip_add.c +++ b/lib/zip_add.c
@@ -37,7 +37,14 @@ -ZIP_EXTERN int +/* + NOTE: Return type is signed so we can return -1 on error. + The index can not be larger than ZIP_INT64_MAX since the size + of the central directory cannot be larger than + ZIP_UINT64_MAX, and each entry is larger than 2 bytes. +*/ + +ZIP_EXTERN zip_int64_t zip_add(struct zip *za, const char *name, struct zip_source *source) { if (name == NULL || source == NULL) { @@ -45,5 +52,5 @@ return -1; } - return _zip_replace(za, -1, name, source); + return _zip_replace(za, ZIP_UINT64_MAX, name, source); }
diff --git a/lib/zip_add_dir.c b/lib/zip_add_dir.c index 39c13ee..28a8ad1 100644 --- a/lib/zip_add_dir.c +++ b/lib/zip_add_dir.c
@@ -40,10 +40,13 @@ -ZIP_EXTERN int +/* NOTE: Signed due to -1 on error. See zip_add.c for more details. */ + +ZIP_EXTERN zip_int64_t zip_add_dir(struct zip *za, const char *name) { - int len, ret; + int len; + zip_int64_t ret; char *s; struct zip_source *source;
diff --git a/lib/zip_close.c b/lib/zip_close.c index baac888..c0a2301 100644 --- a/lib/zip_close.c +++ b/lib/zip_close.c
@@ -323,7 +323,7 @@ cb = zs->f; ud = zs->ud; - if (cb(ud, &st, sizeof(st), ZIP_SOURCE_STAT) < (ssize_t)sizeof(st)) { + if (cb(ud, &st, sizeof(st), ZIP_SOURCE_STAT) < (zip_int64_t)sizeof(st)) { ch_set_error(&za->error, cb, ud); return -1; } @@ -387,7 +387,7 @@ struct zip_error *error) { char buf[BUFSIZE]; - ssize_t n; + zip_int64_t n; st->comp_size = 0; while ((n=cb(ud, buf, sizeof(buf), ZIP_SOURCE_READ)) > 0) { @@ -414,8 +414,8 @@ { char b1[BUFSIZE], b2[BUFSIZE]; int end, flush, ret; - ssize_t n; - size_t n2; + zip_int64_t n; + zip_uint64_t n2; z_stream zstr; int mem_level; @@ -496,7 +496,7 @@ { int e[2]; - if ((cb(ud, e, sizeof(e), ZIP_SOURCE_ERROR)) < (ssize_t)sizeof(e)) { + if ((cb(ud, e, sizeof(e), ZIP_SOURCE_ERROR)) < (zip_int64_t)sizeof(e)) { error->zip_err = ZIP_ER_INTERNAL; error->sys_err = 0; }
diff --git a/lib/zip_delete.c b/lib/zip_delete.c index 382b3fd..8178ebb 100644 --- a/lib/zip_delete.c +++ b/lib/zip_delete.c
@@ -38,9 +38,9 @@ ZIP_EXTERN int -zip_delete(struct zip *za, int idx) +zip_delete(struct zip *za, zip_uint64_t idx) { - if (idx < 0 || idx >= za->nentry) { + if (idx >= za->nentry) { _zip_error_set(&za->error, ZIP_ER_INVAL, 0); return -1; }
diff --git a/lib/zip_entry_new.c b/lib/zip_entry_new.c index 7059b1b..a22dd40 100644 --- a/lib/zip_entry_new.c +++ b/lib/zip_entry_new.c
@@ -1,6 +1,6 @@ /* zip_entry_new.c -- create and init struct zip_entry - Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <libzip@nih.at> @@ -51,7 +51,7 @@ } } else { - if (za->nentry >= za->nentry_alloc-1) { + if (za->nentry+1 >= za->nentry_alloc) { za->nentry_alloc += 16; za->entry = (struct zip_entry *)realloc(za->entry, sizeof(struct zip_entry)
diff --git a/lib/zip_error_to_str.c b/lib/zip_error_to_str.c index bdba41a..11a0cd2 100644 --- a/lib/zip_error_to_str.c +++ b/lib/zip_error_to_str.c
@@ -1,6 +1,6 @@ /* zip_error_to_str.c -- get string representation of zip error code - Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <libzip@nih.at> @@ -43,7 +43,7 @@ ZIP_EXTERN int -zip_error_to_str(char *buf, size_t len, int ze, int se) +zip_error_to_str(char *buf, zip_uint64_t len, int ze, int se) { const char *zs, *ss;
diff --git a/lib/zip_fopen_index.c b/lib/zip_fopen_index.c index 95be69e..3a58bbe 100644 --- a/lib/zip_fopen_index.c +++ b/lib/zip_fopen_index.c
@@ -42,7 +42,7 @@ ZIP_EXTERN struct zip_file * -zip_fopen_index(struct zip *za, int fileno, int flags) +zip_fopen_index(struct zip *za, zip_uint64_t fileno, int flags) { return zip_fopen_index_encrypted(za, fileno, flags, za->default_password); }
diff --git a/lib/zip_fopen_index_encrypted.c b/lib/zip_fopen_index_encrypted.c index ace0a5d..911370b 100644 --- a/lib/zip_fopen_index_encrypted.c +++ b/lib/zip_fopen_index_encrypted.c
@@ -44,7 +44,7 @@ ZIP_EXTERN struct zip_file * -zip_fopen_index_encrypted(struct zip *za, int fileno, int flags, +zip_fopen_index_encrypted(struct zip *za, zip_uint64_t fileno, int flags, const char *password) { int zfflags; @@ -55,7 +55,7 @@ zip_uint64_t start; struct zip_stat st; - if ((fileno < 0) || (fileno >= za->nentry)) { + if (fileno >= za->nentry) { _zip_error_set(&za->error, ZIP_ER_INVAL, 0); return NULL; }
diff --git a/lib/zip_fread.c b/lib/zip_fread.c index 4146b68..ecda5b0 100644 --- a/lib/zip_fread.c +++ b/lib/zip_fread.c
@@ -1,6 +1,6 @@ /* zip_fread.c -- read from file - Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <libzip@nih.at> @@ -37,10 +37,10 @@ -ZIP_EXTERN ssize_t -zip_fread(struct zip_file *zf, void *outbuf, size_t toread) +ZIP_EXTERN zip_int64_t +zip_fread(struct zip_file *zf, void *outbuf, zip_uint64_t toread) { - ssize_t n; + zip_int64_t n; if (!zf) return -1; @@ -48,6 +48,11 @@ if (zf->error.zip_err != 0) return -1; + if (toread > ZIP_INT64_MAX) { + _zip_error_set(&zf->error, ZIP_ER_INVAL, 0); + return -1; + } + if ((zf->flags & ZIP_ZF_EOF) || (toread == 0)) return 0;
diff --git a/lib/zip_get_file_comment.c b/lib/zip_get_file_comment.c index adace72..b9dacbe 100644 --- a/lib/zip_get_file_comment.c +++ b/lib/zip_get_file_comment.c
@@ -38,9 +38,9 @@ ZIP_EXTERN const char * -zip_get_file_comment(struct zip *za, int idx, int *lenp, int flags) +zip_get_file_comment(struct zip *za, zip_uint64_t idx, int *lenp, int flags) { - if (idx < 0 || idx >= za->nentry) { + if (idx >= za->nentry) { _zip_error_set(&za->error, ZIP_ER_INVAL, 0); return NULL; }
diff --git a/lib/zip_get_name.c b/lib/zip_get_name.c index 8f5050b..531af50 100644 --- a/lib/zip_get_name.c +++ b/lib/zip_get_name.c
@@ -38,7 +38,7 @@ ZIP_EXTERN const char * -zip_get_name(struct zip *za, int idx, int flags) +zip_get_name(struct zip *za, zip_uint64_t idx, int flags) { return _zip_get_name(za, idx, flags, &za->error); } @@ -46,9 +46,10 @@ const char * -_zip_get_name(struct zip *za, int idx, int flags, struct zip_error *error) +_zip_get_name(struct zip *za, zip_uint64_t idx, int flags, + struct zip_error *error) { - if (idx < 0 || idx >= za->nentry) { + if (idx >= za->nentry) { _zip_error_set(error, ZIP_ER_INVAL, 0); return NULL; }
diff --git a/lib/zip_rename.c b/lib/zip_rename.c index 1609b5c..d78bbe8 100644 --- a/lib/zip_rename.c +++ b/lib/zip_rename.c
@@ -40,12 +40,12 @@ ZIP_EXTERN int -zip_rename(struct zip *za, int idx, const char *name) +zip_rename(struct zip *za, zip_uint64_t idx, const char *name) { const char *old_name; int old_is_dir, new_is_dir; - if (idx >= za->nentry || idx < 0 || name[0] == '\0') { + if (idx >= za->nentry || name[0] == '\0') { _zip_error_set(&za->error, ZIP_ER_INVAL, 0); return -1; }
diff --git a/lib/zip_replace.c b/lib/zip_replace.c index baa0b8a..03d66d5 100644 --- a/lib/zip_replace.c +++ b/lib/zip_replace.c
@@ -38,7 +38,7 @@ ZIP_EXTERN int -zip_replace(struct zip *za, int idx, struct zip_source *source) +zip_replace(struct zip *za, zip_uint64_t idx, struct zip_source *source) { if (idx < 0 || idx >= za->nentry || source == NULL) { _zip_error_set(&za->error, ZIP_ER_INVAL, 0); @@ -54,8 +54,10 @@ -int -_zip_replace(struct zip *za, int idx, const char *name, +/* NOTE: Signed due to -1 on error. See zip_add.c for more details. */ + +zip_int64_t +_zip_replace(struct zip *za, zip_uint64_t idx, const char *name, struct zip_source *source) { if (ZIP_IS_RDONLY(za)) { @@ -63,7 +65,7 @@ return -1; } - if (idx == -1) { + if (idx == ZIP_UINT64_MAX) { if (_zip_entry_new(za) == NULL) return -1;
diff --git a/lib/zip_set_file_comment.c b/lib/zip_set_file_comment.c index 571e86c..6ae76a0 100644 --- a/lib/zip_set_file_comment.c +++ b/lib/zip_set_file_comment.c
@@ -40,11 +40,12 @@ ZIP_EXTERN int -zip_set_file_comment(struct zip *za, int idx, const char *comment, int len) +zip_set_file_comment(struct zip *za, zip_uint64_t idx, + const char *comment, int len) { char *tmpcom; - if (idx < 0 || idx >= za->nentry + if (idx >= za->nentry || len < 0 || len > MAXCOMLEN || (len > 0 && comment == NULL)) { _zip_error_set(&za->error, ZIP_ER_INVAL, 0);
diff --git a/lib/zip_set_name.c b/lib/zip_set_name.c index 5c7da3d..2a90601 100644 --- a/lib/zip_set_name.c +++ b/lib/zip_set_name.c
@@ -41,12 +41,12 @@ int -_zip_set_name(struct zip *za, int idx, const char *name) +_zip_set_name(struct zip *za, zip_uint64_t idx, const char *name) { char *s; - int i; + zip_int64_t i; - if (idx < 0 || idx >= za->nentry || name == NULL) { + if (idx >= za->nentry || name == NULL) { _zip_error_set(&za->error, ZIP_ER_INVAL, 0); return -1; }
diff --git a/lib/zip_source_buffer.c b/lib/zip_source_buffer.c index e2f1218..bd81894 100644 --- a/lib/zip_source_buffer.c +++ b/lib/zip_source_buffer.c
@@ -1,6 +1,6 @@ /* zip_source_buffer.c -- create zip data source from buffer - Copyright (C) 1999-2008 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <libzip@nih.at> @@ -44,8 +44,7 @@ int freep; }; -static ssize_t read_data(void *state, void *data, size_t len, - enum zip_source_cmd cmd); +static zip_int64_t read_data(void *, void *, zip_uint64_t, enum zip_source_cmd); @@ -83,12 +82,12 @@ -static ssize_t -read_data(void *state, void *data, size_t len, enum zip_source_cmd cmd) +static zip_int64_t +read_data(void *state, void *data, zip_uint64_t len, enum zip_source_cmd cmd) { struct read_data *z; char *buf; - size_t n; + zip_uint64_t n; z = (struct read_data *)state; buf = (char *)data; @@ -99,6 +98,8 @@ return 0; case ZIP_SOURCE_READ: + /* XXX: return error if (len > ZIP_INT64_MAX) */ + n = z->end - z->buf; if (n > len) n = len;
diff --git a/lib/zip_source_call.c b/lib/zip_source_call.c index c07979b..0454e0a 100644 --- a/lib/zip_source_call.c +++ b/lib/zip_source_call.c
@@ -37,8 +37,9 @@ -ZIP_EXTERN ssize_t zip_source_call(struct zip_source *src, void *data, - size_t len, enum zip_source_cmd cmd) +ZIP_EXTERN zip_int64_t zip_source_call(struct zip_source *src, void *data, + zip_uint64_t len, + enum zip_source_cmd cmd) { return src->f(src->ud, data, len, cmd); }
diff --git a/lib/zip_source_deflate.c b/lib/zip_source_deflate.c index 04efd4b..b289500 100644 --- a/lib/zip_source_deflate.c +++ b/lib/zip_source_deflate.c
@@ -50,10 +50,12 @@ z_stream zstr; }; -static ssize_t compress_read(struct deflate *, void *, size_t); -static ssize_t decompress_read(struct deflate *, void *, size_t); -static ssize_t deflate_compress(void *, void *, size_t, enum zip_source_cmd); -static ssize_t deflate_decompress(void *, void *, size_t, enum zip_source_cmd); +static zip_int64_t compress_read(struct deflate *, void *, zip_uint64_t); +static zip_int64_t decompress_read(struct deflate *, void *, zip_uint64_t); +static zip_int64_t deflate_compress(void *, void *, zip_uint64_t, + enum zip_source_cmd); +static zip_int64_t deflate_decompress(void *, void *, zip_uint64_t, + enum zip_source_cmd); @@ -90,12 +92,12 @@ -static ssize_t -compress_read(struct deflate *ctx, void *data, size_t len) +static zip_int64_t +compress_read(struct deflate *ctx, void *data, zip_uint64_t len) { int end, ret; - ssize_t n; - size_t out_before; + zip_int64_t n; + zip_uint64_t out_before; if (ctx->e[0] != 0) return -1; @@ -167,11 +169,11 @@ -static ssize_t -decompress_read(struct deflate *ctx, void *data, size_t len) +static zip_int64_t +decompress_read(struct deflate *ctx, void *data, zip_uint64_t len) { int end, ret; - ssize_t n; + zip_int64_t n; if (ctx->e[0] != 0) return -1; @@ -232,8 +234,9 @@ -static ssize_t -deflate_compress(void *ud, void *data, size_t len, enum zip_source_cmd cmd) +static zip_int64_t +deflate_compress(void *ud, void *data, zip_uint64_t len, + enum zip_source_cmd cmd) { struct deflate *ctx; int ret; @@ -320,11 +323,12 @@ -static ssize_t -deflate_decompress(void *ud, void *data, size_t len, enum zip_source_cmd cmd) +static zip_int64_t +deflate_decompress(void *ud, void *data, zip_uint64_t len, + enum zip_source_cmd cmd) { struct deflate *ctx; - ssize_t n; + zip_int64_t n; int ret; ctx = (struct deflate *)ud;
diff --git a/lib/zip_source_filep.c b/lib/zip_source_filep.c index 7ca0704..7020dd6 100644 --- a/lib/zip_source_filep.c +++ b/lib/zip_source_filep.c
@@ -53,7 +53,7 @@ int e[2]; /* error codes */ }; -static ssize_t read_file(void *state, void *data, size_t len, +static zip_int64_t read_file(void *state, void *data, zip_uint64_t len, enum zip_source_cmd cmd); @@ -120,8 +120,8 @@ -static ssize_t -read_file(void *state, void *data, size_t len, enum zip_source_cmd cmd) +static zip_int64_t +read_file(void *state, void *data, zip_uint64_t len, enum zip_source_cmd cmd) { struct read_file *z; char *buf; @@ -151,6 +151,7 @@ return 0; case ZIP_SOURCE_READ: + /* XXX: return INVAL if len > size_t max */ if (z->remain != -1) n = len > z->remain ? z->remain : len; else
diff --git a/lib/zip_source_pkware.c b/lib/zip_source_pkware.c index 136f08c..8b1c749 100644 --- a/lib/zip_source_pkware.c +++ b/lib/zip_source_pkware.c
@@ -53,9 +53,9 @@ static void decrypt(struct trad_pkware *, zip_uint8_t *, - const zip_uint8_t *, size_t); + const zip_uint8_t *, zip_uint64_t); static int decrypt_header(struct trad_pkware *); -static ssize_t pkware_decrypt(void *, void *, size_t, enum zip_source_cmd); +static zip_int64_t pkware_decrypt(void *, void *, zip_uint64_t, enum zip_source_cmd); @@ -91,10 +91,10 @@ static void decrypt(struct trad_pkware *ctx, zip_uint8_t *out, const zip_uint8_t *in, - size_t len) + zip_uint64_t len) { zip_uint16_t clr; - size_t i; + zip_uint64_t i; Bytef b; for (i=0; i<len; i++) { @@ -123,7 +123,7 @@ { zip_uint8_t header[HEADERLEN]; struct zip_stat st; - ssize_t n; + zip_int64_t n; if ((n=zip_source_call(ctx->src, header, HEADERLEN, ZIP_SOURCE_READ)) < 0) { zip_source_call(ctx->src, ctx->e, sizeof(ctx->e), ZIP_SOURCE_ERROR); @@ -154,11 +154,11 @@ -static ssize_t -pkware_decrypt(void *ud, void *data, size_t len, enum zip_source_cmd cmd) +static zip_int64_t +pkware_decrypt(void *ud, void *data, zip_uint64_t len, enum zip_source_cmd cmd) { struct trad_pkware *ctx; - ssize_t n; + zip_int64_t n; ctx = (struct trad_pkware *)ud; @@ -177,7 +177,7 @@ zip_source_call(ctx->src, ctx->e, sizeof(ctx->e), ZIP_SOURCE_ERROR); return -1; } - decrypt(ud, (zip_uint8_t *)data, (zip_uint8_t *)data, (size_t)n); + decrypt(ud, (zip_uint8_t *)data, (zip_uint8_t *)data, (zip_uint64_t)n); return n; case ZIP_SOURCE_CLOSE:
diff --git a/lib/zip_source_zip.c b/lib/zip_source_zip.c index 4d595be..2b9061f 100644 --- a/lib/zip_source_zip.c +++ b/lib/zip_source_zip.c
@@ -1,6 +1,6 @@ /* zip_source_zip.c -- create data source from zip file - Copyright (C) 1999-2008 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <libzip@nih.at> @@ -45,14 +45,14 @@ zip_int64_t len; }; -static ssize_t read_zip(void *st, void *data, size_t len, +static zip_int64_t read_zip(void *st, void *data, zip_uint64_t len, enum zip_source_cmd cmd); ZIP_EXTERN struct zip_source * -zip_source_zip(struct zip *za, struct zip *srcza, int srcidx, int flags, - zip_uint64_t start, zip_int64_t len) +zip_source_zip(struct zip *za, struct zip *srcza, zip_uint64_t srcidx, + int flags, zip_uint64_t start, zip_int64_t len) { struct zip_error error; struct zip_source *zs; @@ -116,8 +116,8 @@ -static ssize_t -read_zip(void *state, void *data, size_t len, enum zip_source_cmd cmd) +static zip_int64_t +read_zip(void *state, void *data, zip_uint64_t len, enum zip_source_cmd cmd) { struct read_zip *z; char b[8192], *buf;
diff --git a/lib/zip_stat_index.c b/lib/zip_stat_index.c index 60558e4..17bc0a0 100644 --- a/lib/zip_stat_index.c +++ b/lib/zip_stat_index.c
@@ -38,11 +38,12 @@ ZIP_EXTERN int -zip_stat_index(struct zip *za, int index, int flags, struct zip_stat *st) +zip_stat_index(struct zip *za, zip_uint64_t index, int flags, + struct zip_stat *st) { const char *name; - if (index < 0 || index >= za->nentry) { + if (index >= za->nentry) { _zip_error_set(&za->error, ZIP_ER_INVAL, 0); return -1; }
diff --git a/lib/zip_stat_init.c b/lib/zip_stat_init.c index 133ad30..50cc113 100644 --- a/lib/zip_stat_init.c +++ b/lib/zip_stat_init.c
@@ -41,7 +41,7 @@ zip_stat_init(struct zip_stat *st) { st->name = NULL; - st->index = -1; + st->index = ZIP_UINT64_MAX; st->crc = 0; st->mtime = (time_t)-1; st->size = -1;
diff --git a/lib/zip_unchange.c b/lib/zip_unchange.c index ed0d4de..58ec54b 100644 --- a/lib/zip_unchange.c +++ b/lib/zip_unchange.c
@@ -40,7 +40,7 @@ ZIP_EXTERN int -zip_unchange(struct zip *za, int idx) +zip_unchange(struct zip *za, zip_uint64_t idx) { return _zip_unchange(za, idx, 0); } @@ -48,11 +48,11 @@ int -_zip_unchange(struct zip *za, int idx, int allow_duplicates) +_zip_unchange(struct zip *za, zip_uint64_t idx, int allow_duplicates) { int i; - if (idx < 0 || idx >= za->nentry) { + if (idx >= za->nentry) { _zip_error_set(&za->error, ZIP_ER_INVAL, 0); return -1; }
diff --git a/lib/zipint.h b/lib/zipint.h index a047bcd..3ccffa6 100644 --- a/lib/zipint.h +++ b/lib/zipint.h
@@ -123,8 +123,8 @@ char *ch_comment; /* changed archive comment */ int ch_comment_len; /* length of changed zip archive * comment, -1 if unchanged */ - int nentry; /* number of entries */ - int nentry_alloc; /* number of entries allocated */ + zip_uint64_t nentry; /* number of entries */ + zip_uint64_t nentry_alloc; /* number of entries allocated */ struct zip_entry *entry; /* entries */ int nfile; /* number of opened files within archive */ int nfile_alloc; /* number of files allocated */ @@ -251,16 +251,17 @@ int _zip_changed(struct zip *, int *); void _zip_free(struct zip *); -const char *_zip_get_name(struct zip *, int, int, struct zip_error *); +const char *_zip_get_name(struct zip *, zip_uint64_t, int, struct zip_error *); int _zip_local_header_read(struct zip *, int); void *_zip_memdup(const void *, size_t, struct zip_error *); int _zip_name_locate(struct zip *, const char *, int, struct zip_error *); struct zip *_zip_new(struct zip_error *); unsigned short _zip_read2(unsigned char **); unsigned int _zip_read4(unsigned char **); -int _zip_replace(struct zip *, int, const char *, struct zip_source *); -int _zip_set_name(struct zip *, int, const char *); -int _zip_unchange(struct zip *, int, int); +zip_int64_t _zip_replace(struct zip *, zip_uint64_t, const char *, + struct zip_source *); +int _zip_set_name(struct zip *, zip_uint64_t, const char *); +int _zip_unchange(struct zip *, zip_uint64_t, int); void _zip_unchange_data(struct zip_entry *); #endif /* zipint.h */