Blob Blame History Raw
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; i<zf->za->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; i<zf->za->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);