]> granicus.if.org Git - zziplib/commitdiff
need to check on endbuf for stored files #15
authorGuido Draheim <guidod@gmx.de>
Mon, 5 Feb 2018 12:57:49 +0000 (13:57 +0100)
committerGuido Draheim <guidod@gmx.de>
Mon, 5 Feb 2018 12:57:49 +0000 (13:57 +0100)
zzip/memdisk.c
zzip/mmapped.c

index 0222e7d73bd9de716dd86e8cf674d9eb2fc9474d..29b2a1b1b05601b8727ee1ecce4a94ca54095bd1 100644 (file)
@@ -107,7 +107,10 @@ zzip_mem_disk_fdopen(int fd)
        return 0;
     }
     ___ ZZIP_MEM_DISK *dir = zzip_mem_disk_new();
-    zzip_mem_disk_load(dir, disk);
+    if (zzip_mem_disk_load(dir, disk) == -1)
+    {
+       debug2("unable to load disk fd %s", fd);
+    }
     return dir;
     ____;
 }
@@ -124,7 +127,10 @@ zzip_mem_disk_buffer(char *buffer, size_t buflen)
        return 0;
     }
     ___ ZZIP_MEM_DISK *dir = zzip_mem_disk_new();
-    zzip_mem_disk_load(dir, disk);
+    if (zzip_mem_disk_load(dir, disk) == -1)
+    {
+       debug2("unable to load disk buf %p", buffer);
+    }
     return dir;
     ____;
 }
index 5fb6fbfdd3c30bf228ada3e0fe2ddc27cc129247..c61fc5656b69955f76f4feed662c0df9416f271b 100644 (file)
@@ -626,7 +626,13 @@ zzip_disk_entry_fopen(ZZIP_DISK * disk, ZZIP_DISK_ENTRY * entry)
     file->avail = zzip_file_header_usize(header);
 
     if (! file->avail || zzip_file_header_data_stored(header))
-        { file->stored = zzip_file_header_to_data (header); return file; }
+    { 
+         file->stored = zzip_file_header_to_data (header);
+         DBG2("stored size %i", (int) file->avail);
+         if (file->stored + file->avail >= disk->endbuf)
+             goto error;
+         return file; 
+    }
 
     file->stored = 0;
     file->zlib.opaque = 0;
@@ -635,15 +641,20 @@ zzip_disk_entry_fopen(ZZIP_DISK * disk, ZZIP_DISK_ENTRY * entry)
     file->zlib.avail_in = zzip_file_header_csize(header);
     file->zlib.next_in = zzip_file_header_to_data(header);
 
-    if (! zzip_file_header_data_deflated(header) ||
-        inflateInit2(&file->zlib, -MAX_WBITS) != Z_OK)
-    {
-        free (file);
-        errno = EBADMSG;
-        return 0; 
-    }
+    DBG2("compressed size %i", (int) file->zlib.avail_in);
+    if (file->zlib.next_in + file->zlib.avail_in >= disk->endbuf)
+         goto error;
+
+    if (! zzip_file_header_data_deflated(header))
+        goto error;
+    if (inflateInit2(&file->zlib, -MAX_WBITS) != Z_OK)
+        goto error;
 
     return file;
+error:
+    free (file);
+    errno = EBADMSG;
+    return 0; 
     ____;
 }
 
@@ -682,6 +693,12 @@ zzip_disk_fread(void *ptr, zzip_size_t sized, zzip_size_t nmemb,
         size = file->avail;
     if (file->stored)
     {
+        if (file->stored + size >= file->endbuf)
+        {
+            DBG1("try to read beyond end of file");
+            return 0; /* ESPIPE */
+        }
+        DBG3("copy stored %p %i", file->stored, (int)size);
         memcpy(ptr, file->stored, size);
         file->stored += size;
         file->avail -= size;