gschlossnagle Fri Jun 3 03:34:50 2005 EDT Modified files: /php-src/ext/soap soap.c Log: [Move from branch] On architectures that support va_copy (specifically x86_64 linux distros), if you use va_list args more than once, you can corrupt memory - you need to use va_copy instead. man va_copy for details. Also, derefrencing a void * to a long on 64 bit is totally uncool. http://cvs.php.net/diff.php/php-src/ext/soap/soap.c?r1=1.150&r2=1.151&ty=u Index: php-src/ext/soap/soap.c diff -u php-src/ext/soap/soap.c:1.150 php-src/ext/soap/soap.c:1.151 --- php-src/ext/soap/soap.c:1.150 Tue May 31 10:35:55 2005 +++ php-src/ext/soap/soap.c Fri Jun 3 03:34:49 2005 @@ -17,7 +17,7 @@ | Dmitry Stogov <[EMAIL PROTECTED]> | +----------------------------------------------------------------------+ */ -/* $Id: soap.c,v 1.150 2005/05/31 14:35:55 dmitry Exp $ */ +/* $Id: soap.c,v 1.151 2005/06/03 07:34:49 gschlossnagle Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -176,6 +176,21 @@ static void (*old_error_handler)(int, const char *, const uint, const char*, va_list); +#ifdef va_copy +#define call_old_error_handler(error_num, error_filename, error_lineno, format, args) \ +{ \ + va_list copy; \ + va_copy(copy, args); \ + old_error_handler(error_num, error_filename, error_lineno, format, copy); \ + va_end(copy); \ +} +#else +#define call_old_error_handler(error_num, error_filename, error_lineno, format, args) \ +{ \ + old_error_handler(error_num, error_filename, error_lineno, format, args); \ +} +#endif + #define PHP_SOAP_SERVER_CLASSNAME "SoapServer" #define PHP_SOAP_CLIENT_CLASSNAME "SoapClient" #define PHP_SOAP_VAR_CLASSNAME "SoapVar" @@ -387,7 +402,7 @@ static void php_soap_init_globals(zend_soap_globals *soap_globals) { int i; - long enc; + encodePtr enc; zend_hash_init(&soap_globals->defEnc, 0, NULL, NULL, 1); zend_hash_init(&soap_globals->defEncIndex, 0, NULL, NULL, 1); @@ -395,7 +410,7 @@ i = 0; do { - enc = (long)&defaultEncoding[i]; + enc = &defaultEncoding[i]; /* If has a ns and a str_type then index it */ if (defaultEncoding[i].details.type_str) { @@ -1853,7 +1868,7 @@ _old_current_execute_data = EG(current_execute_data); if (!SOAP_GLOBAL(use_soap_error_handler)) { - old_error_handler(error_num, error_filename, error_lineno, format, args); + call_old_error_handler(error_num, error_filename, error_lineno, format, args); return; } @@ -1875,12 +1890,18 @@ char buffer[1024]; int buffer_len; zval outbuf, outbuflen; + va_list argcopy; int old = PG(display_errors); INIT_ZVAL(outbuf); INIT_ZVAL(outbuflen); - +#ifdef va_copy + va_copy(argcopy, args); + buffer_len = vsnprintf(buffer, sizeof(buffer)-1, format, argcopy); + va_end(argcopy); +#else buffer_len = vsnprintf(buffer, sizeof(buffer)-1, format, args); +#endif buffer[sizeof(buffer)-1]=0; if (buffer_len > sizeof(buffer) - 1 || buffer_len < 0) { buffer_len = sizeof(buffer) - 1; @@ -1898,7 +1919,7 @@ PG(display_errors) = 0; zend_try { - old_error_handler(error_num, error_filename, error_lineno, format, args); + call_old_error_handler(error_num, error_filename, error_lineno, format, args); } zend_catch { CG(in_compilation) = _old_in_compilation; EG(in_execution) = _old_in_execution; @@ -1907,10 +1928,10 @@ PG(display_errors) = old; zend_bailout(); } else { - old_error_handler(error_num, error_filename, error_lineno, format, args); + call_old_error_handler(error_num, error_filename, error_lineno, format, args); } #else - old_error_handler(error_num, error_filename, error_lineno, format, args); + call_old_error_handler(error_num, error_filename, error_lineno, format, args); #endif } else { int old = PG(display_errors); @@ -1954,7 +1975,7 @@ PG(display_errors) = 0; zend_try { - old_error_handler(error_num, error_filename, error_lineno, format, args); + call_old_error_handler(error_num, error_filename, error_lineno, format, args); } zend_catch { CG(in_compilation) = _old_in_compilation; EG(in_execution) = _old_in_execution;
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php