1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
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);
|