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