Edit report at http://bugs.php.net/bug.php?id=26158&edit=1
ID: 26158 Updated by: cataphr...@php.net Reported by: mattias at sudac dot org Summary: Open arbitrary file descriptor with fopen -Status: Bogus +Status: Closed Type: Feature/Change Request -Package: Feature/Change Request +Package: *General Issues Operating System: Linux PHP Version: 4.3.3 -Assigned To: +Assigned To: cataphract Block user comment: N Private report: N New Comment: Marking as closed as this was implemented for 5.3/trunk. See also bug #53465. Previous Comments: ------------------------------------------------------------------------ [2010-12-11 02:52:16] cataphr...@php.net Automatic comment from SVN on behalf of cataphract Revision: http://svn.php.net/viewvc/?view=revision&revision=306215 Log: - Implemented request #26158/bug #53465 (open arbitrary file descriptor with fopen) ------------------------------------------------------------------------ [2007-07-24 15:38:37] j...@php.net Linux bugs are not PHP bugs.. ------------------------------------------------------------------------ [2003-11-21 11:16:31] mattias at sudac dot org I think this is unrelated to PHP and very Linux specific, I wrote a C prgoram and run it with tcpserver on FreeBSD and Linux. On FreeBSD it works fine, but on Linux i get this error: open in: No such device or address open out: No such device or address I also found this, so maybe this is solved in Linux 2.6? http://www.geocrawler.com/mail/msg.php3?msg_id=3374944&list=35 #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int main() { int in; int out; in = open("/dev/fd/0", O_RDONLY); if(in == -1) perror("open in"); out = open("/dev/fd/1", O_WRONLY); if(out == -1) perror("open out"); if(out != -1) write(out, "test\n", 5); return 0; } ------------------------------------------------------------------------ [2003-11-07 07:46:06] mattias at sudac dot org It seams to work if the file descriptor is a pipe, but it fails on network sockets. Example: testfd.php: #!/usr/local/bin/php -q <?php echo `ls -l /dev/fd/`; $stdin = fopen('/dev/fd/0', 'r'); $stdout = fopen('/dev/fd/1', 'w'); ?> Server: tcpserver 127.0.0.1 8000 ./testfd.php Client: matt...@icebox:~$ nc localhost 8000 total 0 lrwx------ 1 mattias mattias 64 2003-11-07 13:35 0 -> socket:[2611215] l-wx------ 1 mattias mattias 64 2003-11-07 13:35 1 -> pipe:[2611234] lrwx------ 1 mattias mattias 64 2003-11-07 13:35 2 -> /dev/pts/3 lr-x------ 1 mattias mattias 64 2003-11-07 13:35 3 -> /proc/12706/fd lrwx------ 1 mattias mattias 64 2003-11-07 13:35 4 -> socket:[2611215] lrwx------ 1 mattias mattias 64 2003-11-07 13:35 5 -> socket:[2611215] lrwx------ 1 mattias mattias 64 2003-11-07 13:35 6 -> /dev/pts/3 Warning: fopen(/dev/fd/0): failed to open stream: No such device or address in /home/mattias/projects/jssocket/tests/testfd on line 6 Warning: fopen(/dev/fd/1): failed to open stream: No such device or address in /home/mattias/projects/jssocket/tests/testfd on line 7 If we run the script without tcpserver we get this: matt...@icebox:~$ ./testfd total 0 lrwx------ 1 mattias mattias 64 2003-11-07 13:37 0 -> /dev/pts/3 l-wx------ 1 mattias mattias 64 2003-11-07 13:37 1 -> pipe:[2611379] lrwx------ 1 mattias mattias 64 2003-11-07 13:37 2 -> /dev/pts/3 lr-x------ 1 mattias mattias 64 2003-11-07 13:37 3 -> /proc/12709/fd lrwx------ 1 mattias mattias 64 2003-11-07 13:37 4 -> /dev/pts/3 lrwx------ 1 mattias mattias 64 2003-11-07 13:37 5 -> /dev/pts/3 lrwx------ 1 mattias mattias 64 2003-11-07 13:37 6 -> /dev/pts/3 Notice the difference, also notice that /dev/fd is a symlink to /proc/self/fd: matt...@icebox:~$ ls -l /dev/fd lrwxrwxrwx 1 root root 13 2001-12-21 18:29 /dev/fd -> /proc/self/fd This is on Debian unstable, Linux 2.4.21. I noticed this when i moved a script from FreeBSD 4.8 to Linux. ------------------------------------------------------------------------ [2003-11-07 06:44:39] w...@php.net Why does fopen("/dev/fd/x", "r") fail ? ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at http://bugs.php.net/bug.php?id=26158 -- Edit this bug report at http://bugs.php.net/bug.php?id=26158&edit=1