summaryrefslogtreecommitdiff
path: root/ext/zip/lib
diff options
context:
space:
mode:
Diffstat (limited to 'ext/zip/lib')
-rw-r--r--ext/zip/lib/zip_close.c42
-rw-r--r--ext/zip/lib/zip_fclose.c14
-rw-r--r--ext/zip/lib/zip_fread.c21
-rw-r--r--ext/zip/lib/zip_get_archive_comment.c10
-rw-r--r--ext/zip/lib/zip_open.c3
5 files changed, 52 insertions, 38 deletions
diff --git a/ext/zip/lib/zip_close.c b/ext/zip/lib/zip_close.c
index d9fc6eea4..bc640c77b 100644
--- a/ext/zip/lib/zip_close.c
+++ b/ext/zip/lib/zip_close.c
@@ -175,6 +175,7 @@ zip_close(struct zip *za)
de.filename = strdup("-");
de.filename_len = 1;
cd->entry[j].filename = "-";
+ cd->entry[j].filename_len = 1;
}
else {
de.filename = strdup(za->cdir->entry[i].filename);
@@ -195,13 +196,15 @@ zip_close(struct zip *za)
error = 1;
break;
}
+ memcpy(cd->entry+j, za->cdir->entry+i, sizeof(cd->entry[j]));
+
if (de.bitflags & ZIP_GPBF_DATA_DESCRIPTOR) {
de.crc = za->cdir->entry[i].crc;
de.comp_size = za->cdir->entry[i].comp_size;
de.uncomp_size = za->cdir->entry[i].uncomp_size;
de.bitflags &= ~ZIP_GPBF_DATA_DESCRIPTOR;
- }
- memcpy(cd->entry+j, za->cdir->entry+i, sizeof(cd->entry[j]));
+ cd->entry[j].bitflags &= ~ZIP_GPBF_DATA_DESCRIPTOR;
+ }
}
if (za->entry[i].ch_filename) {
@@ -229,11 +232,10 @@ zip_close(struct zip *za)
zs = NULL;
if (!ZIP_ENTRY_DATA_CHANGED(za->entry+i)) {
- if ((zs=zip_source_zip(za, za, i, ZIP_FL_RECOMPRESS, 0, -1))
- == NULL) {
- error = 1;
- break;
- }
+ if ((zs=zip_source_zip(za, za, i, ZIP_FL_RECOMPRESS, 0, -1)) == NULL) {
+ error = 1;
+ break;
+ }
}
if (add_data(za, zs ? zs : za->entry[i].source, &de, out) < 0) {
@@ -286,27 +288,27 @@ zip_close(struct zip *za)
return -1;
}
- if (za->zp) {
- fclose(za->zp);
- za->zp = NULL;
- reopen_on_error = 1;
+ if (za->zp) {
+ fclose(za->zp);
+ za->zp = NULL;
+ reopen_on_error = 1;
}
if (_zip_rename(temp, za->zn) != 0) {
- _zip_error_set(&za->error, ZIP_ER_RENAME, errno);
- remove(temp);
- free(temp);
- if (reopen_on_error) {
- /* ignore errors, since we're already in an error case */
- za->zp = fopen(za->zn, "rb");
+ _zip_error_set(&za->error, ZIP_ER_RENAME, errno);
+ remove(temp);
+ free(temp);
+ if (reopen_on_error) {
+ /* ignore errors, since we're already in an error case */
+ za->zp = fopen(za->zn, "rb");
+ }
+ return -1;
}
- return -1;
- }
mask = umask(0);
umask(mask);
chmod(za->zn, 0666&~mask);
_zip_free(za);
- free(temp);
+ free(temp);
return 0;
}
diff --git a/ext/zip/lib/zip_fclose.c b/ext/zip/lib/zip_fclose.c
index 6bf697301..8f062d9d0 100644
--- a/ext/zip/lib/zip_fclose.c
+++ b/ext/zip/lib/zip_fclose.c
@@ -49,13 +49,13 @@ zip_fclose(struct zip_file *zf)
free(zf->buffer);
free(zf->zstr);
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;
- }
- }
+ 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 --git a/ext/zip/lib/zip_fread.c b/ext/zip/lib/zip_fread.c
index 1c0c8ac63..c0b71b861 100644
--- a/ext/zip/lib/zip_fread.c
+++ b/ext/zip/lib/zip_fread.c
@@ -41,7 +41,7 @@ ZIP_EXTERN(ssize_t)
zip_fread(struct zip_file *zf, void *outbuf, size_t toread)
{
int ret;
- size_t out_before, len;
+ size_t out_before, len;
int i;
if (!zf)
@@ -63,7 +63,7 @@ zip_fread(struct zip_file *zf, void *outbuf, size_t toread)
}
return 0;
}
-
+
if ((zf->flags & ZIP_ZF_DECOMP) == 0) {
ret = _zip_file_fillbuf(outbuf, toread, zf);
if (ret > 0) {
@@ -83,15 +83,26 @@ zip_fread(struct zip_file *zf, void *outbuf, size_t toread)
ret = inflate(zf->zstr, Z_SYNC_FLUSH);
switch (ret) {
- case Z_OK:
case Z_STREAM_END:
+ zf->flags |= ZIP_ZF_EOF;
+
+ case Z_OK:
+
/* all ok */
/* Z_STREAM_END probably won't happen, since we didn't
have a header */
len = zf->zstr->total_out - out_before;
if (len >= zf->bytes_left || len >= toread) {
- if (zf->flags & ZIP_ZF_CRC)
- zf->crc = crc32(zf->crc, (Bytef *)outbuf, len);
+ if (zf->flags & ZIP_ZF_CRC) {
+ zf->crc = crc32(zf->crc, (Bytef *)outbuf, len);
+ if (zf->flags & ZIP_ZF_EOF == 1) {
+ if (zf->crc != zf->crc_orig) {
+ _zip_error_set(&zf->error, ZIP_ER_CRC, 0);
+ return -1;
+ }
+
+ }
+ }
zf->bytes_left -= len;
return len;
}
diff --git a/ext/zip/lib/zip_get_archive_comment.c b/ext/zip/lib/zip_get_archive_comment.c
index fe97e6e8c..ed1324fd5 100644
--- a/ext/zip/lib/zip_get_archive_comment.c
+++ b/ext/zip/lib/zip_get_archive_comment.c
@@ -42,11 +42,11 @@ zip_get_archive_comment(struct zip *za, int *lenp, int flags)
{
if ((flags & ZIP_FL_UNCHANGED)
|| (za->ch_comment_len == -1)) {
- if (za->cdir) {
- if (lenp != NULL)
- *lenp = za->cdir->comment_len;
- return za->cdir->comment;
- }
+ if (za->cdir) {
+ if (lenp != NULL)
+ *lenp = za->cdir->comment_len;
+ return za->cdir->comment;
+ }
else {
if (lenp != NULL)
*lenp = -1;
diff --git a/ext/zip/lib/zip_open.c b/ext/zip/lib/zip_open.c
index dbab6ec4a..e3840197d 100644
--- a/ext/zip/lib/zip_open.c
+++ b/ext/zip/lib/zip_open.c
@@ -75,9 +75,10 @@ zip_open(const char *fn, int flags, int *zep)
if (!(flags & ZIP_OVERWRITE)) {
return NULL;
}
-
+
case 0:
return _zip_allocate_new(fn, zep);
+
default:
break;
}