[PATCH] fix crash in solaris when fdopen() fails
| From: | Uwe Schindler | Date: | Thu, 07 Apr 2005 07:40:43 +0000 |
| Subject: | [PATCH] fix crash in solaris when fdopen() fails | ||
| Groups: | php.internals | ||
| Request: | Send a blank email to internals+get-15890@lists.php.net to get a copy of this message | ||
I am fixing bug #32614: Problem, on the solaris platform fdopen() can fail
even if fd is a correct file descriptor, when fd>255 (the well-known
solaris stdio problem). The webserver of the user crashes because the
return value of fdopen() is not checked for NULL when casting a stream from
posix to stdio. After this fd==-1 and fp==NULL ==> further calls to
fread/fwrite with this fp segfault.
I committed the patches for PHP but I have no karme for "ZendEngine2". Can
someone with karma submit this patch?
According to this it would be interesting, WHEN some PHP/Zend code tries to
cast a POSIX stream to stdio? In which extension/functions? Can this be
fixed to only use posix IO? The zend engine itself should be safe since
4.3.3 and since PHP5.
Does stream casts apply if a user uses the PHP user functions fopen, fread,
fwrite? Since Saschas fix in PHP4 there this does not happen. What about PHP5?
I would try to fix this everywhere in the future.
-----
Uwe Schindler
thetaphi@php.net - http://www.php.net
NSAPI SAPI developer
Erlangen, Germany
Index: Zend/zend_stream.c =================================================================== RCS file: /repository/ZendEngine2/zend_stream.c,v retrieving revision 1.10 diff -u -r1.10 zend_stream.c --- Zend/zend_stream.c 13 Mar 2005 17:48:45 -0000 1.10 +++ Zend/zend_stream.c 7 Apr 2005 07:29:54 -0000 @@ -60,6 +60,9 @@ case ZEND_HANDLE_FD: file_handle->handle.fp = fdopen(file_handle->handle.fd, "rb"); + if (file_handle->handle.fp == NULL) { + return FAILURE; + } file_handle->type = ZEND_HANDLE_FP; break;
Index: Zend/zend_stream.c =================================================================== RCS file: /repository/ZendEngine2/zend_stream.c,v retrieving revision 1.10 diff -u -r1.10 zend_stream.c --- Zend/zend_stream.c 13 Mar 2005 17:48:45 -0000 1.10 +++ Zend/zend_stream.c 7 Apr 2005 07:29:54 -0000 @@ -60,6 +60,9 @@ case ZEND_HANDLE_FD: file_handle->handle.fp = fdopen(file_handle->handle.fd, "rb"); + if (file_handle->handle.fp == NULL) { + return FAILURE; + } file_handle->type = ZEND_HANDLE_FP; break;