[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: [php-maint] Bug#777275: php5-cli: Odd compiled assembly causing mmap detection to sometimes fail



Control: reassign -1 gcc-4.9
Control: affects -1 php5-cli

Hi gcc maintainers,

I am not doing anything special in php5 compilation, so it seems to be
something in gcc (as I guess dotdeb is using wheezy's compiler), so I am
reassigning to gcc. If you think that php is at fault, please reassign
back (and little help with the assembly would be appreciated).

The submitter is using non-existant email, so I cannot ask him...

Cheers,
Ondrej

On Sat, Feb 7, 2015, at 10:49, anon wrote:
> Package: php5-cli
> Version: 5.6.5+dfsg-1
> Severity: normal
> 
> Dear Maintainer,
> 
> I've noticed some weird assembly being generated in the following piece
> of code.  I've only noticed this in the Debian amd64 binary - DotDeb's
> version doesn't seem to have the issue.
> I suspect that this may be related to a compiler issue.
> 
> >From main/streams/plain_wrapper.c:
> 
> 				switch (value) {
> 					case PHP_STREAM_MMAP_SUPPORTED:
> 						return fd == -1 ? PHP_STREAM_OPTION_RETURN_ERR : PHP_STREAM_OPTION_RETURN_OK;
> 
> 					case PHP_STREAM_MMAP_MAP_RANGE:
> 						do_fstat(data, 1);
> 
> The above return statement (third line) seems to compile to the
> following:
> 
>   >x0x6a4740 <php_stdiop_set_option+672>    cmp    $0xffffffff,%r14d                      ; if (fd == -1)
>    x0x6a4744 <php_stdiop_set_option+676>    je     0x6a4632
>    <php_stdiop_set_option+402>   ;   return -1
>    x0x6a474a <php_stdiop_set_option+682>    mov    $0x1,%esi             
>                    ;
>    x0x6a474f <php_stdiop_set_option+687>    mov    %rbp,%rdi             
>                    ;
>    x0x6a4752 <php_stdiop_set_option+690>    callq  0x6a4440 <do_fstat>   
>                    ; do_fstat(%rdi, 1)
>    x0x6a4757 <php_stdiop_set_option+695>    xor    %eax,%eax             
>                    ;
>    x0x6a4759 <php_stdiop_set_option+697>    cmpq   $0x400000,0x60(%rbp)  
>                    ; %eax = -( *(%rbp+0x60) > 0x400000 )
>    x0x6a4761 <php_stdiop_set_option+705>    setg   %al                   
>                    ;
>    x0x6a4764 <php_stdiop_set_option+708>    neg    %eax                  
>                    ;
>    x0x6a4766 <php_stdiop_set_option+710>    jmpq   0x6a4538
>    <php_stdiop_set_option+152>   ; return %eax
> 
> First bit looks okay, but I don't know what the rest is about.  DotDeb's
> binary seems to compile to the following:
> 
>   >x0x693f55 <php_stdiop_set_option+437>    cmp    $0xffffffff,%r13d                      ; if (fd == -1)
>    x0x693f59 <php_stdiop_set_option+441>    je     0x693ea8
>    <php_stdiop_set_option+264>   ;   return -1
>    x0x693f5f <php_stdiop_set_option+447>    xor    %ebx,%ebx             
>                    ; %ebx = 0
>    x0x693f61 <php_stdiop_set_option+449>    jmpq   0x693de3
>    <php_stdiop_set_option+67>    ; return %ebx
> 
> ....which makes a whole lot more sense.
> 
> I'm not sure what the "0x60(%rbp)" is referring to, but I've seen the
> comparison evaluate to true and false in various cases, sometimes causing
> mmap detection to fail.
> 
> I've only tested this with PHP 5.6.5 so I don't know what version it
> showed up in.
> 
> If you want a way to test it yourself, you can use the following PHP
> script:
> 
> # cat >t.php
> 	<?php
> 	$fr=fopen('/bin/ls','rb');
> 	$fw=fopen('/dev/null','wb');
> 	stream_copy_to_stream($fr, $fw);
> ^D
> # gdb php
> 	break php_stdiop_set_option
> 	run t.php
> 	
> 	[ when it breaks, step through the assembly until you see the above ]
> 
> 
> 
> 
> -- Package-specific info:
> ==== Additional PHP 5 information ====
> 
> ++++ PHP 5 SAPI (php5query -S): ++++
> cli
> 
> ++++ PHP 5 Extensions (php5query -M -v): ++++
> pdo (Enabled for cli by maintainer script)
> opcache (Enabled for cli by maintainer script)
> json (Enabled for cli by maintainer script)
> 
> ++++ Configuration files: ++++
> [PHP]
> engine = On
> short_open_tag = On
> asp_tags = Off
> precision = 14
> output_buffering = 4096
> zlib.output_compression = Off
> implicit_flush = Off
> unserialize_callback_func =
> serialize_precision = 17
> disable_functions =
> disable_classes =
> zend.enable_gc = On
> expose_php = On
> max_execution_time = 30
> max_input_time = 60
> memory_limit = -1
> error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
> display_errors = Off
> display_startup_errors = Off
> log_errors = On
> log_errors_max_len = 1024
> ignore_repeated_errors = Off
> ignore_repeated_source = Off
> report_memleaks = On
> track_errors = Off
> html_errors = On
> variables_order = "GPCS"
> request_order = "GP"
> register_argc_argv = Off
> auto_globals_jit = On
> post_max_size = 8M
> auto_prepend_file =
> auto_append_file =
> default_mimetype = "text/html"
> doc_root =
> user_dir =
> enable_dl = On
> file_uploads = On
> upload_max_filesize = 2M
> max_file_uploads = 20
> allow_url_fopen = On
> allow_url_include = Off
> default_socket_timeout = 60
> [CLI Server]
> cli_server.color = On
> [Date]
> [filter]
> [iconv]
> [intl]
> [sqlite]
> [sqlite3]
> [Pcre]
> [Pdo]
> [Pdo_mysql]
> pdo_mysql.cache_size = 2000
> pdo_mysql.default_socket=
> [Phar]
> [mail function]
> SMTP = localhost
> smtp_port = 25
> mail.add_x_header = On
> [SQL]
> sql.safe_mode = Off
> [ODBC]
> odbc.allow_persistent = On
> odbc.check_persistent = On
> odbc.max_persistent = -1
> odbc.max_links = -1
> odbc.defaultlrl = 4096
> odbc.defaultbinmode = 1
> [Interbase]
> ibase.allow_persistent = 1
> ibase.max_persistent = -1
> ibase.max_links = -1
> ibase.timestampformat = "%Y-%m-%d %H:%M:%S"
> ibase.dateformat = "%Y-%m-%d"
> ibase.timeformat = "%H:%M:%S"
> [MySQL]
> mysql.allow_local_infile = On
> mysql.allow_persistent = On
> mysql.cache_size = 2000
> mysql.max_persistent = -1
> mysql.max_links = -1
> mysql.default_port =
> mysql.default_socket =
> mysql.default_host =
> mysql.default_user =
> mysql.default_password =
> mysql.connect_timeout = 60
> mysql.trace_mode = Off
> [MySQLi]
> mysqli.max_persistent = -1
> mysqli.allow_persistent = On
> mysqli.max_links = -1
> mysqli.cache_size = 2000
> mysqli.default_port = 3306
> mysqli.default_socket =
> mysqli.default_host =
> mysqli.default_user =
> mysqli.default_pw =
> mysqli.reconnect = Off
> [mysqlnd]
> mysqlnd.collect_statistics = On
> mysqlnd.collect_memory_statistics = Off
> [OCI8]
> [PostgreSQL]
> pgsql.allow_persistent = On
> pgsql.auto_reset_persistent = Off
> pgsql.max_persistent = -1
> pgsql.max_links = -1
> pgsql.ignore_notice = 0
> pgsql.log_notice = 0
> [Sybase-CT]
> sybct.allow_persistent = On
> sybct.max_persistent = -1
> sybct.max_links = -1
> sybct.min_server_severity = 10
> sybct.min_client_severity = 10
> [bcmath]
> bcmath.scale = 0
> [browscap]
> [Session]
> session.save_handler = files
> session.use_cookies = 1
> session.use_only_cookies = 1
> session.name = PHPSESSID
> session.auto_start = 0
> session.cookie_lifetime = 0
> session.cookie_path = /
> session.cookie_domain =
> session.cookie_httponly =
> session.serialize_handler = php
> session.gc_probability = 0
> session.gc_divisor = 1000
> session.gc_maxlifetime = 1440
> session.referer_check =
> session.cache_limiter = nocache
> session.cache_expire = 180
> session.use_trans_sid = 0
> session.hash_function = 0
> session.hash_bits_per_character = 5
> url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry"
> [MSSQL]
> mssql.allow_persistent = On
> mssql.max_persistent = -1
> mssql.max_links = -1
> mssql.min_error_severity = 10
> mssql.min_message_severity = 10
> mssql.compatability_mode = Off
> mssql.secure_connection = Off
> [Assertion]
> [COM]
> [mbstring]
> [gd]
> [exif]
> [Tidy]
> tidy.clean_output = Off
> [soap]
> soap.wsdl_cache_enabled=1
> soap.wsdl_cache_dir="/tmp"
> soap.wsdl_cache_ttl=86400
> soap.wsdl_cache_limit = 5
> [sysvshm]
> [ldap]
> ldap.max_links = -1
> [mcrypt]
> [dba]
> [curl]
> 
> **** /etc/php5/cli/conf.d/20-json.ini ****
> extension=json.so
> 
> **** /etc/php5/cli/conf.d/10-pdo.ini ****
> extension=pdo.so
> 
> **** /etc/php5/cli/conf.d/05-opcache.ini ****
> zend_extension=opcache.so
> 
> 
> -- System Information:
> Debian Release: 7.8
>   APT prefers testing
>   APT policy: (500, 'testing'), (500, 'stable')
> Architecture: amd64 (x86_64)
> Foreign Architectures: i386
> 
> Kernel: Linux 2.6.32-042stab092.2 (SMP w/6 CPU cores)
> Locale: LANG=C, LC_CTYPE=C (charmap=ANSI_X3.4-1968)
> Shell: /bin/sh linked to /bin/dash
> 
> Versions of packages php5-cli depends on:
> ii  libbz2-1.0        1.0.6-4
> ii  libc6             2.19-13
> ii  libcomerr2        1.42.5-1.1
> ii  libdb5.3          5.3.28-7~deb8u1
> ii  libedit2          2.11-20080614-5
> ii  libgssapi-krb5-2  1.10.1+dfsg-5+deb7u3
> ii  libk5crypto3      1.10.1+dfsg-5+deb7u3
> ii  libkrb5-3         1.10.1+dfsg-5+deb7u3
> ii  libmagic1         5.11-2+deb7u7
> ii  libonig2          5.9.5-3.2
> ii  libpcre3          2:8.35-3.3
> ii  libqdbm14         1.8.78-2
> ii  libssl1.0.0       1.0.1e-2+deb7u14
> ii  libxml2           2.9.1+dfsg1-4
> ii  mime-support      3.52-1+deb7u1
> ii  php5-common       5.6.5+dfsg-1
> ii  php5-json         1.3.6-1
> ii  tzdata            2014j-0wheezy1
> ii  ucf               3.0025+nmu3
> ii  zlib1g            1:1.2.7.dfsg-13
> 
> Versions of packages php5-cli recommends:
> pn  php5-readline  <none>
> 
> Versions of packages php5-cli suggests:
> pn  php-pear  <none>
> 
> Versions of packages php5-common depends on:
> ii  libc6   2.19-13
> ii  lsof    4.86+dfsg-1
> ii  psmisc  22.19-1+deb7u1
> ii  sed     4.2.1-10
> ii  ucf     3.0025+nmu3
> 
> Versions of packages php5-common suggests:
> pn  php5-user-cache  <none>
> 
> -- no debconf information
> 
> _______________________________________________
> pkg-php-maint mailing list
> pkg-php-maint@lists.alioth.debian.org
> http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-php-maint


-- 
Ondřej Surý <ondrej@sury.org>
Knot DNS (https://www.knot-dns.cz/) – a high-performance DNS server


Reply to: