diff options
author | Nuno Lopes <nlopess@php.net> | 2009-01-28 23:18:49 +0000 |
---|---|---|
committer | Nuno Lopes <nlopess@php.net> | 2009-01-28 23:18:49 +0000 |
commit | 86df0f095d249d8127cf73bfbeaa3ee2c3e645eb (patch) | |
tree | 95ecf8b684399ffe55e731e538ddc6176156b132 /Zend/zend_stream.c | |
parent | 68c140b288eac828adc636dcec114db6f172b7ed (diff) | |
download | php-git-86df0f095d249d8127cf73bfbeaa3ee2c3e645eb.tar.gz |
the offset parameter of mmap() must be aligned to a page boundary (although linux doesnt strictly require it).
use 0 as offset as it will be small and increment the ptrs afterwards
Diffstat (limited to 'Zend/zend_stream.c')
-rw-r--r-- | Zend/zend_stream.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/Zend/zend_stream.c b/Zend/zend_stream.c index 10183d664b..1b63daafd6 100644 --- a/Zend/zend_stream.c +++ b/Zend/zend_stream.c @@ -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; } } |