]> granicus.if.org Git - php/commitdiff
Change streams to not use mmap() when reading files (aka copying to memory).
authorAntony Dovgal <tony2001@php.net>
Mon, 24 Mar 2008 16:28:08 +0000 (16:28 +0000)
committerAntony Dovgal <tony2001@php.net>
Mon, 24 Mar 2008 16:28:08 +0000 (16:28 +0000)
There are two problems with mmap() in this case:
1) there is no performance gain since we allocate the memory anyways;
2) memcpy() may crash if somebody truncates this file at the same moment
(see http://dev.daylessday.org/diff/mmap.phps for example);

It seems to work fine with fpassthru(), though why it is so should be investigated.

Thanks to Andrey Vasilishin for the report and Anight for pressing this through =)

main/streams/streams.c

index a466767ecac862defa9e0ab545e8b143b20db648..7282dcaa2494d947e57ebae03ce2b6b15bcdaaa4 100755 (executable)
@@ -1648,27 +1648,6 @@ PHPAPI size_t _php_stream_copy_to_mem_ex(php_stream *src, zend_uchar rettype, vo
                maxlen = 0;
        }
 
-       if (php_stream_mmap_possible(src)) {
-               /* guarantees src->readbuf_type == IS_STRING */
-               char *p;
-               size_t mapped;
-
-               p = php_stream_mmap_range(src, php_stream_tell(src), maxlen, PHP_STREAM_MAP_MODE_SHARED_READONLY, &mapped);
-
-               if (p && mapped) {
-                       *buf = pemalloc_rel_orig(mapped + 1, persistent);
-
-                       if (*buf) {
-                               memcpy(*buf, p, mapped);
-                               ((char*)(*buf))[mapped] = 0;
-                       }
-
-                       php_stream_mmap_unmap(src);
-
-                       return mapped;
-               }
-       }
-
        if (maxlen > 0) {
                if (rettype == IS_UNICODE) {
                        ptr.u = *buf = pemalloc_rel_orig(UBYTES(maxlen + 1), persistent);