andrey Thu Dec 22 18:11:39 2005 EDT
Added files: (Branch: PHP_5_1)
/php-src/ext/mysqli/tests bug35759.phpt
Modified files:
/php-src/ext/mysqli mysqli.c mysqli_api.c
Log:
fix for bug# 35759
(mysqli_stmt_bind_result() makes huge allocation when column empty)
#this shows some leaks now, which has to be investigated but closes the
#bug report.
http://cvs.php.net/viewcvs.cgi/php-src/ext/mysqli/mysqli.c?r1=1.72.2.5&r2=1.72.2.6&diff_format=u
Index: php-src/ext/mysqli/mysqli.c
diff -u php-src/ext/mysqli/mysqli.c:1.72.2.5
php-src/ext/mysqli/mysqli.c:1.72.2.6
--- php-src/ext/mysqli/mysqli.c:1.72.2.5 Tue Nov 15 14:28:40 2005
+++ php-src/ext/mysqli/mysqli.c Thu Dec 22 18:11:39 2005
@@ -15,7 +15,7 @@
| Author: Georg Richter <[EMAIL PROTECTED]> |
+----------------------------------------------------------------------+
- $Id: mysqli.c,v 1.72.2.5 2005/11/15 14:28:40 dmitry Exp $
+ $Id: mysqli.c,v 1.72.2.6 2005/12/22 18:11:39 andrey Exp $
*/
#ifdef HAVE_CONFIG_H
@@ -155,11 +155,11 @@
MY_STMT *stmt = (MY_STMT *)my_res->ptr;
php_clear_stmt_bind(stmt);
}
- } else if (instanceof_function(intern->zo.ce, mysqli_result_class_entry
TSRMLS_CC)) { /* stmt object */
+ } else if (instanceof_function(intern->zo.ce, mysqli_result_class_entry
TSRMLS_CC)) { /* result object */
if (my_res && my_res->ptr) {
mysql_free_result(my_res->ptr);
}
- } else if (instanceof_function(intern->zo.ce,
mysqli_warning_class_entry TSRMLS_CC)) { /* stmt object */
+ } else if (instanceof_function(intern->zo.ce,
mysqli_warning_class_entry TSRMLS_CC)) { /* warning object */
if (my_res && my_res->ptr) {
php_clear_warnings((MYSQLI_WARNING *)my_res->info);
}
@@ -459,7 +459,7 @@
zend_hash_init(&mysqli_driver_properties, 0, NULL, NULL, 1);
MYSQLI_ADD_PROPERTIES(&mysqli_driver_properties,
mysqli_driver_property_entries);
zend_hash_add(&classes, ce->name, ce->name_length+1,
&mysqli_driver_properties, sizeof(mysqli_driver_properties), NULL);
- ce->ce_flags |= ZEND_ACC_FINAL_CLASS;
+ ce->ce_flags |= ZEND_ACC_FINAL_CLASS;
REGISTER_MYSQLI_CLASS_ENTRY("mysqli", mysqli_link_class_entry,
mysqli_link_methods);
ce = mysqli_link_class_entry;
@@ -469,7 +469,7 @@
REGISTER_MYSQLI_CLASS_ENTRY("mysqli_warning",
mysqli_warning_class_entry, mysqli_warning_methods);
ce = mysqli_warning_class_entry;
- ce->ce_flags |= ZEND_ACC_FINAL_CLASS | ZEND_ACC_PROTECTED;
+ ce->ce_flags |= ZEND_ACC_FINAL_CLASS | ZEND_ACC_PROTECTED;
zend_hash_init(&mysqli_warning_properties, 0, NULL, NULL, 1);
MYSQLI_ADD_PROPERTIES(&mysqli_warning_properties,
mysqli_warning_property_entries);
zend_hash_add(&classes, ce->name, ce->name_length+1,
&mysqli_warning_properties, sizeof(mysqli_warning_properties), NULL);
http://cvs.php.net/viewcvs.cgi/php-src/ext/mysqli/mysqli_api.c?r1=1.118.2.10&r2=1.118.2.11&diff_format=u
Index: php-src/ext/mysqli/mysqli_api.c
diff -u php-src/ext/mysqli/mysqli_api.c:1.118.2.10
php-src/ext/mysqli/mysqli_api.c:1.118.2.11
--- php-src/ext/mysqli/mysqli_api.c:1.118.2.10 Thu Dec 1 14:12:55 2005
+++ php-src/ext/mysqli/mysqli_api.c Thu Dec 22 18:11:39 2005
@@ -15,7 +15,7 @@
| Author: Georg Richter <[EMAIL PROTECTED]> |
+----------------------------------------------------------------------+
- $Id: mysqli_api.c,v 1.118.2.10 2005/12/01 14:12:55 andrey Exp $
+ $Id: mysqli_api.c,v 1.118.2.11 2005/12/22 18:11:39 andrey Exp $
*/
#ifdef HAVE_CONFIG_H
@@ -323,20 +323,26 @@
#ifdef FIELD_TYPE_NEWDECIMAL
case MYSQL_TYPE_NEWDECIMAL:
#endif
+ {
+ ulong tmp;
stmt->result.buf[ofs].type = IS_STRING;
/*
If the user has called
$stmt->store_result() then we have asked
max_length to be updated. this is done
only for BLOBS because we don't want to allocate
big chunkgs of memory 2^16 or 2^24
*/
- if (stmt->stmt->fields[ofs].max_length == 0) {
+ if (stmt->stmt->fields[ofs].max_length == 0 &&
+ !mysql_stmt_attr_get(stmt->stmt,
STMT_ATTR_UPDATE_MAX_LENGTH, &tmp) && !tmp)
+ {
stmt->result.buf[ofs].buflen =
(stmt->stmt->fields) ?
(stmt->stmt->fields[ofs].length) ? stmt->stmt->fields[ofs].length + 1: 256: 256;
} else {
/*
the user has called
store_result(). if he does not there is no way to determine the
+ libmysql does not allow us to
allocate 0 bytes for a buffer so we try 1
*/
- stmt->result.buf[ofs].buflen =
stmt->stmt->fields[ofs].max_length;
+ if (!(stmt->result.buf[ofs].buflen =
stmt->stmt->fields[ofs].max_length))
+ ++stmt->result.buf[ofs].buflen;
}
stmt->result.buf[ofs].val = (char
*)emalloc(stmt->result.buf[ofs].buflen);
bind[ofs].buffer_type = MYSQL_TYPE_STRING;
@@ -345,6 +351,7 @@
bind[ofs].buffer_length =
stmt->result.buf[ofs].buflen;
bind[ofs].length =
&stmt->result.buf[ofs].buflen;
break;
+ }
default:
php_error_docref(NULL TSRMLS_CC, E_WARNING,
"Server returned unknown type %ld. Probably your client library is incompatible
with the server version you use!", col_type);
break;
http://cvs.php.net/viewcvs.cgi/php-src/ext/mysqli/tests/bug35759.phpt?view=markup&rev=1.1
Index: php-src/ext/mysqli/tests/bug35759.phpt
+++ php-src/ext/mysqli/tests/bug35759.phpt
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php