dmitry Fri Jul 14 08:29:07 2006 UTC Modified files: /php-src/ext/standard var.c Log: Fixed unserialize() in unicode mode http://cvs.php.net/viewvc.cgi/php-src/ext/standard/var.c?r1=1.236&r2=1.237&diff_format=u Index: php-src/ext/standard/var.c diff -u php-src/ext/standard/var.c:1.236 php-src/ext/standard/var.c:1.237 --- php-src/ext/standard/var.c:1.236 Wed Jul 12 17:23:53 2006 +++ php-src/ext/standard/var.c Fri Jul 14 08:29:06 2006 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: var.c,v 1.236 2006/07/12 17:23:53 andrei Exp $ */ +/* $Id: var.c,v 1.237 2006/07/14 08:29:06 dmitry Exp $ */ @@ -1092,7 +1092,7 @@ PHP_FUNCTION(unserialize) { - unsigned char *buf; + zstr buf; char *str = NULL; int buf_len; zend_uchar buf_type; @@ -1115,24 +1115,34 @@ str = emalloc(buf_len+1); for (i = 0; i < buf_len; i++) { - if (buf[i] > 128) { + if (buf.u[i] > 128) { php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Error at offset %d of %d bytes", i, buf_len); + if (str) { + efree(str); + } + RETURN_FALSE; } - str[i] = buf[i]; + str[i] = buf.u[i]; } str[i] = '\0'; - buf = str; + buf.s = str; } - p = (const unsigned char*)buf; + p = (const unsigned char*)buf.s; PHP_VAR_UNSERIALIZE_INIT(var_hash); if (!php_var_unserialize(&return_value, &p, p + buf_len, &var_hash TSRMLS_CC)) { PHP_VAR_UNSERIALIZE_DESTROY(var_hash); zval_dtor(return_value); - php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Error at offset %ld of %d bytes", (long)((unsigned char*)p - buf), buf_len); + php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Error at offset %ld of %d bytes", (long)((char*)p - buf.s), buf_len); + if (str) { + efree(str); + } RETURN_FALSE; } PHP_VAR_UNSERIALIZE_DESTROY(var_hash); + if (str) { + efree(str); + } } /* }}} */
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php