]> granicus.if.org Git - php/commitdiff
fixed bc break related to #57905
authorAnatoliy Belsky <ab@php.net>
Thu, 7 Jun 2012 14:27:47 +0000 (16:27 +0200)
committerAnatoliy Belsky <ab@php.net>
Thu, 7 Jun 2012 19:01:32 +0000 (21:01 +0200)
ext/zip/lib/zip_open.c

index 2f56881b0a9d2ceeba4c46cf4f11cd1a2f1d07d4..a348d9800dd889a4332350fff59b63c2db6e3881 100644 (file)
@@ -206,7 +206,9 @@ _zip_readcdir(FILE *fp, off_t buf_offset, unsigned char *buf, unsigned char *eoc
     cd->comment = NULL;
     cd->comment_len = _zip_read2(&cdp);
 
-    if (((zip_uint64_t)cd->offset)+cd->size > buf_offset + (eocd-buf)) {
+       /* without checking the ZIP_CHECKCONS flag we'll not able even to open inconsistent
+          archives at this place, which would break bc in PHP */
+    if ((ZIP_CHECKCONS == (flags & ZIP_CHECKCONS)) && ((zip_uint64_t)cd->offset)+cd->size > buf_offset + (eocd-buf)) {
        /* cdir spans past EOCD record */
        _zip_error_set(error, ZIP_ER_INCONS, 0);
        cd->nentry = 0;
@@ -237,7 +239,13 @@ _zip_readcdir(FILE *fp, off_t buf_offset, unsigned char *buf, unsigned char *eoc
        }
     }
 
-    if (cd->offset >= buf_offset) {
+       /* the first if branch goes the old way of libzip 0.9 so we don't loose 
+          the bc for reading inconsistent files */
+       if ((ZIP_CHECKCONS != (flags & ZIP_CHECKCONS)) && cd->size < (unsigned int)(eocd-buf)) {
+       cdp = eocd - cd->size;
+       bufp = &cdp;
+       }
+       else if (cd->offset >= buf_offset) {
        /* if buffer already read in, use it */
        cdp = buf + (cd->offset - buf_offset);
        bufp = &cdp;