From:             vadim at vadiaz dot com
Operating system: Linux x86_64
PHP version:      5.2.5
PHP Bug Type:     Zip Related
Bug description:  wrong default cast for offset used in fseek

Description:
------------
zip extention failed to open zip files with thousands of files in root
directory on 64 bit Linux systems. From strace I seen than fseek get value
close to max_long.
After reviewing code I figured out that it caused by wrong default type
cast in php-5.2.5/ext/zip/lib/zip_open.c:313

fseek(fp, -(cd->size+cd->comment_len+EOCDLEN), SEEK_END);

which should be:

fseek(fp, -((long)(cd->size+cd->comment_len+EOCDLEN)), SEEK_END);

because on 64 bit systems long is 8 byte. 
I aaplied following path and rebuild rpms for my CentOS 5 from scratch
which solves the problem

--- php-5.2.5/ext/zip/lib/zip_open.c.seek_error 2008-02-05
22:05:03.000000000 +0200                                                   
                      
+++ php-5.2.5/ext/zip/lib/zip_open.c    2008-02-05 23:17:05.000000000
+0200                                                                      
           
@@ -313,7 +313,7 @@                                                       
                                                                           
      
        /* go to start of cdir and read it entry by entry */              
                                                                           
      
        bufp = NULL;                                                      
                                                                           
      
        clearerr(fp);                                                     
                                                                           
      
-       fseek(fp, -(cd->size+cd->comment_len+EOCDLEN), SEEK_END);         
                                                                           
      
+       fseek(fp, -((long)(cd->size+cd->comment_len+EOCDLEN)), SEEK_END); 
                                                                           
      
        if (ferror(fp) || ((unsigned int)ftell(fp) != cd->offset)) {      
                                                                           
      
            /* seek error or offset of cdir wrong */                      
                                                                           
      
            if (ferror(fp))                         




Reproduce code:
---------------
<html>
<head>
<title>Test of ZipArchive</title>
</head>
<body>
<?php
ini_set('display_errors','true');
include_once "/home/httpd/includes/general/zip0stream.php";

include "zip0://testSite.zip/f1/tst.php";

?>
</body>
</html>


Expected result:
----------------
<html>
<head>
<title>Test of ZipArchive</title>
</head>
<body>
<center><h1>ZipArchive works Ok</h1></center></body>
</html>


Actual result:
--------------
can not open stream 'zip0://testSite.zip/f1/tst.php'

-- 
Edit bug report at http://bugs.php.net/?id=44055&edit=1
-- 
Try a CVS snapshot (PHP 4.4): 
http://bugs.php.net/fix.php?id=44055&r=trysnapshot44
Try a CVS snapshot (PHP 5.2): 
http://bugs.php.net/fix.php?id=44055&r=trysnapshot52
Try a CVS snapshot (PHP 5.3): 
http://bugs.php.net/fix.php?id=44055&r=trysnapshot53
Try a CVS snapshot (PHP 6.0): 
http://bugs.php.net/fix.php?id=44055&r=trysnapshot60
Fixed in CVS:                 http://bugs.php.net/fix.php?id=44055&r=fixedcvs
Fixed in release:             
http://bugs.php.net/fix.php?id=44055&r=alreadyfixed
Need backtrace:               http://bugs.php.net/fix.php?id=44055&r=needtrace
Need Reproduce Script:        http://bugs.php.net/fix.php?id=44055&r=needscript
Try newer version:            http://bugs.php.net/fix.php?id=44055&r=oldversion
Not developer issue:          http://bugs.php.net/fix.php?id=44055&r=support
Expected behavior:            http://bugs.php.net/fix.php?id=44055&r=notwrong
Not enough info:              
http://bugs.php.net/fix.php?id=44055&r=notenoughinfo
Submitted twice:              
http://bugs.php.net/fix.php?id=44055&r=submittedtwice
register_globals:             http://bugs.php.net/fix.php?id=44055&r=globals
PHP 3 support discontinued:   http://bugs.php.net/fix.php?id=44055&r=php3
Daylight Savings:             http://bugs.php.net/fix.php?id=44055&r=dst
IIS Stability:                http://bugs.php.net/fix.php?id=44055&r=isapi
Install GNU Sed:              http://bugs.php.net/fix.php?id=44055&r=gnused
Floating point limitations:   http://bugs.php.net/fix.php?id=44055&r=float
No Zend Extensions:           http://bugs.php.net/fix.php?id=44055&r=nozend
MySQL Configuration Error:    http://bugs.php.net/fix.php?id=44055&r=mysqlcfg

Reply via email to