]> granicus.if.org Git - php/commitdiff
the offset parameter of mmap() must be aligned to a page boundary (although linux...
authorNuno Lopes <nlopess@php.net>
Wed, 28 Jan 2009 23:18:49 +0000 (23:18 +0000)
committerNuno Lopes <nlopess@php.net>
Wed, 28 Jan 2009 23:18:49 +0000 (23:18 +0000)
use 0 as offset as it will be small and increment the ptrs afterwards

Zend/zend_stream.c

index 10183d664bdcc42d6a6088d2a9795970e9b3f9d8..1b63daafd6d25e7a0247dbd6ffbfb66ae8f2008e 100644 (file)
@@ -214,11 +214,18 @@ ZEND_API int zend_stream_fixup(zend_file_handle *file_handle, char **buf, size_t
 #if HAVE_MMAP
                if (file_handle->handle.fp) {
                        /*  *buf[size] is zeroed automatically by the kernel */
-                       *buf = mmap(0, size + ZEND_MMAP_AHEAD, PROT_READ, MAP_PRIVATE, fileno(file_handle->handle.fp), ftell(file_handle->handle.fp));
+                       *buf = mmap(0, size + ZEND_MMAP_AHEAD, PROT_READ, MAP_PRIVATE, fileno(file_handle->handle.fp), 0);
                        if (*buf != MAP_FAILED) {
-                               file_handle->handle.stream.mmap.len = size;
+                               long offset = ftell(file_handle->handle.fp);
                                file_handle->handle.stream.mmap.map = *buf;
+
+                               if (offset != -1) {
+                                       *buf += offset;
+                                       size -= offset;
+                               }
                                file_handle->handle.stream.mmap.buf = *buf;
+                               file_handle->handle.stream.mmap.len = size;
+
                                goto return_mapped;
                        }
                }