diff -up libzip-0.10/lib/zip_close.c.php libzip-0.10/lib/zip_close.c --- libzip-0.10/lib/zip_close.c.php 2011-02-20 09:01:03.000000000 -0500 +++ libzip-0.10/lib/zip_close.c 2012-01-25 18:37:04.188136374 -0500 @@ -602,13 +602,15 @@ _zip_create_temp_output(struct zip *za, char *temp; int tfd; FILE *tfp; + + int len = strlen(za->zn) + 8; - if ((temp=(char *)malloc(strlen(za->zn)+8)) == NULL) { + if ((temp=(char *)malloc(len)) == NULL) { _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); return NULL; } - sprintf(temp, "%s.XXXXXX", za->zn); + snprintf(temp, len, "%s.XXXXXX", za->zn); if ((tfd=mkstemp(temp)) == -1) { _zip_error_set(&za->error, ZIP_ER_TMPOPEN, errno); diff -up libzip-0.10/lib/zip_fclose.c.php libzip-0.10/lib/zip_fclose.c --- libzip-0.10/lib/zip_fclose.c.php 2010-03-08 07:27:48.000000000 -0500 +++ libzip-0.10/lib/zip_fclose.c 2012-01-25 18:36:22.389542215 -0500 @@ -47,12 +47,14 @@ zip_fclose(struct zip_file *zf) if (zf->src) zip_source_free(zf->src); - for (i=0; iza->nfile; i++) { - if (zf->za->file[i] == zf) { - zf->za->file[i] = zf->za->file[zf->za->nfile-1]; - zf->za->nfile--; - break; - } + if (zf->za) { + for (i=0; iza->nfile; i++) { + if (zf->za->file[i] == zf) { + zf->za->file[i] = zf->za->file[zf->za->nfile-1]; + zf->za->nfile--; + break; + } + } } ret = 0; diff -up libzip-0.10/lib/zip.h.php libzip-0.10/lib/zip.h --- libzip-0.10/lib/zip.h.php 2011-03-04 12:17:43.000000000 -0500 +++ libzip-0.10/lib/zip.h 2012-01-25 18:36:22.389542215 -0500 @@ -59,7 +59,7 @@ extern "C" { #define ZIP_CREATE 1 #define ZIP_EXCL 2 #define ZIP_CHECKCONS 4 - +#define ZIP_OVERWRITE 8 /* flags for zip_name_locate, zip_fopen, zip_stat, ... */ diff -up libzip-0.10/lib/zip_open.c.php libzip-0.10/lib/zip_open.c --- libzip-0.10/lib/zip_open.c.php 2011-03-16 07:18:44.000000000 -0400 +++ libzip-0.10/lib/zip_open.c 2012-01-25 18:36:22.389542215 -0500 @@ -61,10 +61,16 @@ ZIP_EXTERN struct zip * zip_open(const char *fn, int flags, int *zep) { FILE *fp; + + if (flags & ZIP_OVERWRITE) { + return _zip_allocate_new(fn, zep); + } switch (_zip_file_exists(fn, flags, zep)) { case -1: - return NULL; + if (!(flags & ZIP_OVERWRITE)) { + return NULL; + } case 0: return _zip_allocate_new(fn, zep); default: @@ -482,7 +488,7 @@ _zip_file_exists(const char *fn, int fla } if (stat(fn, &st) != 0) { - if (flags & ZIP_CREATE) + if (flags & ZIP_CREATE || flags & ZIP_OVERWRITE) return 0; else { set_error(zep, NULL, ZIP_ER_OPEN);