Edit report at https://bugs.php.net/bug.php?id=62072&edit=1

 ID:                 62072
 Updated by:         ras...@php.net
 Reported by:        mr_platelet+jin6vr at fastmail dot fm
 Summary:            The "copy" function can't copy files from /proc
 Status:             Open
-Type:               Bug
+Type:               Feature/Change Request
 Package:            Filesystem function related
 Operating System:   Debian Linux 6.0.4
 PHP Version:        5.3.13
 Block user comment: N
 Private report:     N

 New Comment:

/proc files are special and aren't actually files at all. One of the weird 
characteristics of "files" in /proc is that they have a size of 0 bytes.

eg.

% stat /proc/self/stat
  File: `/proc/self/stat'
  Size: 0               Blocks: 0          IO Block: 1024   regular empty file
Device: 3h/3d   Inode: 2290608     Links: 1
Access: (0444/-r--r--r--)  Uid: ( 1000/  rasmus)   Gid: ( 1000/  rasmus)
Access: 2012-05-19 19:37:34.891956230 +0200
Modify: 2012-05-19 19:37:34.891956230 +0200
Change: 2012-05-19 19:37:34.891956230 +0200
 Birth: -

And a "man 2 stat" has this note:

   For  most  files  under the /proc directory, stat() does not return the
   file size in the st_size field; instead the field is returned with  the
   value 0.

PHP's various file-related functions rely on stat telling the truth as the 
stream-to-stream copy first checks to see if it is possible to stat the src 
stream. If it is a stat'able stream, we get the size and then if it is an 
mmap'able stream we will mmap based on that size. If stat() tells us we have a 
0-length file we short-circuit everything and return at that point because in 
every case other than for /proc files this is the correct behaviour. 

In order to fix this we would have to add a special-case for stat'able streams 
that lie about the size which I would consider more of a feature request than a 
bug.


Previous Comments:
------------------------------------------------------------------------
[2012-05-19 16:39:26] mr_platelet+jin6vr at fastmail dot fm

Description:
------------
The "copy" function can't copy files from /proc.

This is the "configure" line I used to compile PHP.  (Don't be misled
by the value for "prefix"; I'm using PHP 5.3.13, not PHP 5.3.12.)

./configure  --prefix=/usr/local/php/5.3.12 --disable-cgi --with-
pgsql=shared,/usr --with-xmlrpc=shared --with-tidy=shared,/usr --with-
mssql=shared,/usr --with-sqlite=shared,/usr --with-snmp=shared,/usr --with-
xsl=shared,/usr --with-recode=shared,/usr --with-unixODBC=shared,/usr --with-
pspell=shared,/usr --with-mysqli=shared,/usr/bin/mysql_config --with-
mysql=shared,/usr --with-mcrypt=shared,/usr --with-ldap-sasl=/usr --with-
ldap=shared,/usr --with-t1lib=shared,/usr --with-ttf=shared,/usr --enable-
intl=shared --with-pdo-firebird=shared,/usr --with-interbase=shared,/usr --with-
imap-ssl --with-freetype-dir=shared,/usr --with-png-dir=shared,/usr --with-xpm-
dir=shared,/usr/X11R6 --with-jpeg-dir=shared,/usr --with-gmp=shared,/usr --
enable-gd-native-ttf --with-gd=shared,/usr --with-zlib-dir=/usr --with-
enchant=shared,/usr --with-curl=shared,/usr --without-mm --with-mhash=yes --
enable-zip --enable-soap --with-openssl=/usr --with-kerberos=/usr --with-zlib --
with-libxml-dir=/usr --enable-wddx --enable-sockets --enable-shmop --with-pcre-
regex=/usr --with-onig=/usr --enable-mbstring --with-gettext --enable-ftp --
enable-exif --with-iconv --without-gdbm --with-db4 --enable-ctype --with-bz2 --
enable-bcmath --enable-sysvmsg --enable-sysvshm --enable-sysvsem --enable-
calendar --with-pic --disable-static --disable-rpath --with-regex=php --disable-
debug --enable-pcntl --with-readline

Test script:
---------------
<?php
copy("/proc/self/stat", "php://stdout");

Expected result:
----------------
I expect the script to print the contents of /proc/self/stat.

Actual result:
--------------
The script prints nothing.


------------------------------------------------------------------------



-- 
Edit this bug report at https://bugs.php.net/bug.php?id=62072&edit=1

Reply via email to