From: sl9 at gmx dot net
Operating system: Linux 2.6, ArchLinux
PHP version: 5.2.6
PHP Bug Type: Dynamic loading
Bug description: Php registered streams: no streams registered with session.so
Description:
------------
Hi,
I compiled php 5.2.6 with the suhosin patch. I have some issues
relating to the session.so and
simplexml.so modules, which also affects zlib.so and bz2.so.
I have traced behavior, which doesn't let me include or read files,
to the registered php
streams. Which is easily obtainable from the phpinfo() output.
Consider the lines below and their output. The registered php streams
string gets mangled by
including different modules. The resulting string seems to be
semantically incorrect.
I've tried a lot of different configure lines, changing extensions,
with or without the suhosin
patch. Didn't seem to change results except when I used --enable-
simplexml instead of --enable-
simplexml=shared. So compiling it in or loading it via php.ini is a
workaround.
Reproduce code:
---------------
The configure string I used contains all the options I could find (sorry
about that).
--enable-libxml=shared
--without-libxml-dir
--with-openssl=shared
--with-kerberos=shared
--with-pcre-regex=/usr
--with-zlib=shared
--without-zlib-dir
--disable-bcmath
--with-bz2=shared
--enable-calendar=shared
--enable-ctype
--with-curl=shared
--without-curl-wrappers
--disable-dba
--without-qdbm
--without-gdbm
--without-ndbm
--without-db4
--without-db3
--without-db2
--without-db1
--without-dbm
--without-cdb
--disable-inifile
--disable-flatfile
--disable-dbase
--enable-dom
--without-libxml-dir
--enable-exif=shared
--without-fbsql
--without-fdftk
--enable-filter
--without-pcre-dir
--enable-ftp=shared
--without-openssl-dir
--with-gd=shared
--with-jpeg-dir=shared,/usr
--with-png-dir=shared,/usr
--without-zlib-dir
--without-xmp-dir
--with-ttf=shared
--without-freetype-dir
--without-t1lib
--enable-gd-native-ttf
--disable-gd-jis-conv
--without-gettext
--without-gmp
--enable-hash=shared
--with-iconv=shared
--without-imap
--with-kerberos
--with-imap-ssl=shared
--without-interbase
--enable-json=shared
--without-ldap
--without-ldap-sasl
--disable-mbstring
--disable-mbregex
--disable-mbregex-backtrack
--without-libmbfl
--with-mcrypt=shared
--with-mhash=shared
--with-mime-magic=shared
--without-ming
--without-msql
--without-mssql
--with-mysql=shared
--with-mysql-sock=/tmp/mysql.sock
--without-zlib-dir
--with-mysqli=shared
--disable-embedded-mysqli
--without-ncurses
--without-oci8
--without-adabas
--without-sapdb
--without-solid
--without-ibm-db2
--without-ODBCRouter
--without-empress
--without-empress-bcs
--without-birdstep
--without-custom-odbc
--without-iodbc
--without-esoob
--without-unixODBC
--without-dbmaker
--enable-pcntl
--enable-pdo=shared
--without-pdo-dblib
--without-pdo-firebird
--with-pdo-mysql=shared
--without-zlib-dir
--without-pdo-oci
--without-pdo-odbc
--without-pdo-pgsql
--with-pdo-sqlite=shared
--without-pgsql
--enable-posix=shared
--without-pspell
--without-libedit
--with-readline=shared
--without-recode
--enable-reflection
--enable-session=shared
--without-mm
--enable-shmop=shared
--enable-simplexml=shared
--without-libxml-dir
--without-snmp
--without-openssl-dir
--without-ucd-snmp-hack
--enable-soap=shared
--without-libxml-dir
--enable-sockets=shared
--enable-spl=shared
--with-sqlite=shared
--enable-sqlite-utf8=shared
--with-regex=php
--without-sybase
--without-sybase-ct
--enable-sysvmsg=shared
--enable-sysvsem=shared
--enable-sysvshm=shared
--without-tidy
--disable-tokenizer
--disable-wddx
--without-libxml-dir
--without-libexpat-dir
--enable-xml
--without-libxml-dir
--without-libexpat-dir
--enable-xmlreader=shared
--without-libxml-dir
--without-xmlrpc
--without-libxml-dir
--without-libexpat-dir
--without-iconv-dir
--enable-xmlwriter=shared
--without-libxml-dir
--with-xsl=shared
--enable-zip=shared
--without-zlib-dir
I have ran my test code on different configurations, but the issues seem
to be directly related to the php registered streams string. Which is
easier to capture, post and relate to behavior, which is done in the
'actual result' section.
Example 1:
php.ini: (no extensions loaded)
phpinfo()'s registered php streams: "php, file, data, http, ftp"
Note: local file opening/reading (fopen, fread) and inclusion (include,
require, require_once) is working fully.
Example 2:
php.ini:
extension=bz2.so
extension=zlib.so
phpinfo()'s registered php streams: "php, file, data, http, ftp"
Note: the two compression streams are not registered and don't work.
Example 3:
php.ini:
extension=bz2.so
extension=session.so
extension=zlib.so
phpinfo()'s registered php streams: "no streams registered"
Note: at this point files can be opened but cannot be read, more on this
in the 'actual result' section.
Example 4:
php.ini:
extension=session.so
phpinfo()'s registered php streams: "no streams registered"
Note: the session module seems to be the culprit.
Example 5:
php.ini:
extension=simplexml.so
phpinfo()'s registered php streams: "php, file, data, http, ftp"
Note: simplexml doesn't seem to change anything.
Example 6:
php.ini:
extension=session.so
extension=simplexml.so
phpinfo()'s registered php streams: "php, file, data, http, ftp"
Note: coupled with the session module simplexml restores the registered
streams.
Example 7:
php.ini:
extension=bz2.so
extension=session.so
extension=simplexml.so
extension=zlib.so
phpinfo()'s registered php streams: "compress.bzip2, php, file, data,
http, ftp, compress.zlib"
Note: simplexml even enables the two compression streams to be
registered.
Example 8:
php.ini:
extension=bz2.so
extension=simplexml.so
extension=zlib.so
phpinfo()'s registered php streams: "php, file, data, http, ftp,
compress.bzip2, compress.zlib"
Note: the string's elements have changed position.
Test code:
With the above configurations I've ran the following code.
bugtest.inc.php:
File included.
<?php
function bugtest(){
echo "Function accessible\n";
}
?>
bugtest.php:
<pre>
<?php
$incResult = include("bugtest.inc.php");
if(!$incResult){
echo "Include failed.\n";
}else{
echo "Include succeeded.\n\n";
if(!function_exists("bugtest")){
echo "Function 'bugtest' is not defined.\n";
}else{
echo "Function 'bugtest' is defined.... invoking:\n";
bugtest();
}
echo "\nCode included was (via fopen):\n";
$fp = fopen("bugtest.inc.php",'r');
while(!feof($fp)){
$readBuffer = fread($fp,128);
if($readBuffer){
$readBuffer = str_replace(array('<','>'),
array('<','>'),
$readBuffer);
echo
"Read(".strlen($readBuffer)."):\n".$readBuffer."\n";
}else{
echo "Read failed.\n";
}
}
fclose($fp);
echo "\nCode included was (via file_get_contents):\n";
$readBuffer = file_get_contents("bugtest.inc.php");
if($readBuffer){
$readBuffer = str_replace(array('<','>'),
array('<','>'),
$readBuffer);
echo "Read(".strlen($readBuffer)."):\n".$readBuffer."\n";
}else{
echo "Read failed.\n";
}
echo "\nCode included was (via highlight_file):";
highlight_file("bugtest.inc.php");
echo "\nGZip compressed text file (via file_get_contents):\n";
$readBuffer = file_get_contents("compress.zlib://bugtest.gz");
if($readBuffer){
echo "Read(".strlen($readBuffer)."):\n".$readBuffer."\n";
}else{
echo "Read failed.\n";
}
echo "\nBZip2 compressed text file (via file_get_contents):\n";
$readBuffer = file_get_contents("compress.bzip2://bugtest.bz2");
if($readBuffer){
echo "Read(".strlen($readBuffer)."):\n".$readBuffer."\n";
}else{
echo "Read failed.\n";
}
}
?>
</pre>
Expected result:
----------------
Expected results are pretty straight forward, but I could be wrong in
my assumptions.
When I load no extensions I expect to have enough registered streams
to use the php core (fopen,
fread, include, etc.).
When I load the zlib.so module I expect to get an additional
'compress.zlib' registered stream, which is usable in reading those
types of streams.
When I load the bzip2.so module I expect to get an additional
'compress.bzip2' registered stream,
which is usable in reading those types of streams.
I expect the loading of the session.so module not to affect the
registered streams string.
I expect the loading of the simplexml.so module not to affect the
registered streams string.
I don't expect the simplexml.so module to 'fix' the registered
streams string after the session
module has corrupted it.
I don't expect the simplexml.so module to 'fix' the registered
streams string when loading the
compression modules.
Actual result:
--------------
The results have several different flavors, related to the php
registered streams string.
Registered streams string: "php, file, data, http, ftp"
Include done: Yes
Function accessible: Yes
Code output: Yes (fopen, file_get_contents, highlight_file)
Compressed output: No, compression stream not registered. (Bzip2,
Gzip)
Registered streams string: "no streams registered"
Include done: No, but include returns true
Function accessible: No, function not defined
Code output: No
fopen code output: fopen succeeds, but fread appends the following
error at the end of the
document.
"Warning: Unknown list entry type in request shutdown (-1) in Unknown
on line 0"
file_get_contents output: returns false
highlight_file output: empty output (probably also failure when
reading)
Compressed output: No, compression stream not registered. (Bzip2,
Gzip)
Registered streams string: "compress.bzip2, php, file, data, http,
ftp, compress.zlib"
Include done: Yes
Function accessible: Yes
Code output: Yes (fopen, file_get_contents, highlight_file)
Compressed output: Yes (Bzip2, Gzip)
Registered streams string: "php, file, data, http, ftp,
compress.bzip2, compress.zlib"
Include done: Yes
Function accessible: Yes
Code output: Yes (fopen, file_get_contents, highlight_file)
Compressed output: Yes (Bzip2, Gzip)
--
Edit bug report at http://bugs.php.net/?id=46076&edit=1
--
Try a CVS snapshot (PHP 5.2):
http://bugs.php.net/fix.php?id=46076&r=trysnapshot52
Try a CVS snapshot (PHP 5.3):
http://bugs.php.net/fix.php?id=46076&r=trysnapshot53
Try a CVS snapshot (PHP 6.0):
http://bugs.php.net/fix.php?id=46076&r=trysnapshot60
Fixed in CVS: http://bugs.php.net/fix.php?id=46076&r=fixedcvs
Fixed in release:
http://bugs.php.net/fix.php?id=46076&r=alreadyfixed
Need backtrace: http://bugs.php.net/fix.php?id=46076&r=needtrace
Need Reproduce Script: http://bugs.php.net/fix.php?id=46076&r=needscript
Try newer version: http://bugs.php.net/fix.php?id=46076&r=oldversion
Not developer issue: http://bugs.php.net/fix.php?id=46076&r=support
Expected behavior: http://bugs.php.net/fix.php?id=46076&r=notwrong
Not enough info:
http://bugs.php.net/fix.php?id=46076&r=notenoughinfo
Submitted twice:
http://bugs.php.net/fix.php?id=46076&r=submittedtwice
register_globals: http://bugs.php.net/fix.php?id=46076&r=globals
PHP 4 support discontinued: http://bugs.php.net/fix.php?id=46076&r=php4
Daylight Savings: http://bugs.php.net/fix.php?id=46076&r=dst
IIS Stability: http://bugs.php.net/fix.php?id=46076&r=isapi
Install GNU Sed: http://bugs.php.net/fix.php?id=46076&r=gnused
Floating point limitations: http://bugs.php.net/fix.php?id=46076&r=float
No Zend Extensions: http://bugs.php.net/fix.php?id=46076&r=nozend
MySQL Configuration Error: http://bugs.php.net/fix.php?id=46076&r=mysqlcfg