georg Wed Dec 31 03:34:03 2003 EDT
Modified files:
/php-src/ext/mysqli php_mysqli.h mysqli.c mysqli_nonapi.c
mysqli_api.c
Log:
fixed memleak and segfault when constructor call failed
Index: php-src/ext/mysqli/php_mysqli.h
diff -u php-src/ext/mysqli/php_mysqli.h:1.26 php-src/ext/mysqli/php_mysqli.h:1.27
--- php-src/ext/mysqli/php_mysqli.h:1.26 Sat Dec 13 08:44:56 2003
+++ php-src/ext/mysqli/php_mysqli.h Wed Dec 31 03:34:02 2003
@@ -15,7 +15,7 @@
| Author: Georg Richter <[EMAIL PROTECTED]> |
+----------------------------------------------------------------------+
- $Id: php_mysqli.h,v 1.26 2003/12/13 13:44:56 helly Exp $
+ $Id: php_mysqli.h,v 1.27 2003/12/31 08:34:02 georg Exp $
*/
/* A little hack to prevent build break, when mysql is used together with
@@ -57,12 +57,13 @@
} PROFILER;
typedef struct {
- void *ptr; /* resource: (mysql, result, stmt) */
+ void *ptr; /* resource: (mysql, result, stmt) */
} MYSQLI_RESOURCE;
typedef struct _mysqli_object {
zend_object zo;
void *ptr;
+ char valid;
HashTable *prop_handler;
} mysqli_object; /* extends zend_object */
@@ -136,7 +137,8 @@
} \
#define MYSQLI_REGISTER_RESOURCE_EX(__ptr, __zval, __ce) \
- ((mysqli_object *) zend_object_store_get_object(__zval TSRMLS_CC))->ptr =
__ptr;
+ ((mysqli_object *) zend_object_store_get_object(__zval TSRMLS_CC))->ptr =
__ptr; \
+ ((mysqli_object *) zend_object_store_get_object(__zval TSRMLS_CC))->valid = 1;
#define MYSQLI_RETURN_RESOURCE(__ptr, __ce) \
Z_TYPE_P(return_value) = IS_OBJECT; \
@@ -162,6 +164,10 @@
php_error(E_WARNING, "Couldn't fetch %s", intern->zo.ce->name);\
RETURN_NULL();\
}\
+ if (!intern->valid) { \
+ php_error(E_WARNING, "invalid resource %s", intern->zo.ce->name); \
+ RETURN_NULL(); \
+ } \
__ptr = (__type)my_res->ptr; \
if (!strcmp((char *)__name, "mysqli_stmt")) {\
if (!((STMT *)__ptr)->stmt->mysql) {\
Index: php-src/ext/mysqli/mysqli.c
diff -u php-src/ext/mysqli/mysqli.c:1.22 php-src/ext/mysqli/mysqli.c:1.23
--- php-src/ext/mysqli/mysqli.c:1.22 Fri Dec 12 19:28:20 2003
+++ php-src/ext/mysqli/mysqli.c Wed Dec 31 03:34:02 2003
@@ -15,7 +15,7 @@
| Author: Georg Richter <[EMAIL PROTECTED]> |
+----------------------------------------------------------------------+
- $Id: mysqli.c,v 1.22 2003/12/13 00:28:20 georg Exp $
+ $Id: mysqli.c,v 1.23 2003/12/31 08:34:02 georg Exp $
*/
#ifdef HAVE_CONFIG_H
@@ -165,6 +165,14 @@
zend_object_handlers *std_hnd;
int ret;
+ ret = FAILURE;
+ obj = (mysqli_object *)zend_objects_get_address(object TSRMLS_CC);
+
+ if (!obj->valid) {
+ retval = EG(uninitialized_zval_ptr);
+ return(retval);
+ }
+
if (member->type != IS_STRING) {
tmp_member = *member;
zval_copy_ctor(&tmp_member);
@@ -172,9 +180,6 @@
member = &tmp_member;
}
- ret = FAILURE;
- obj = (mysqli_object *)zend_objects_get_address(object TSRMLS_CC);
-
if (obj->prop_handler != NULL) {
ret = zend_hash_find(obj->prop_handler, Z_STRVAL_P(member),
Z_STRLEN_P(member)+1, (void **) &hnd);
}
@@ -198,7 +203,7 @@
}
/* }}} */
-/* {{{ mysqli_read_property */
+/* {{{ mysqli_write_property */
void mysqli_write_property(zval *object, zval *member, zval *value TSRMLS_DC)
{
zval tmp_member;
@@ -261,6 +266,7 @@
intern->zo.in_get = 0;
intern->zo.in_set = 0;
intern->ptr = NULL;
+ intern->valid = 0;
intern->prop_handler = NULL;
zend_hash_find(&classes, class_type->name, class_type->name_length + 1, (void
**) &intern->prop_handler);
Index: php-src/ext/mysqli/mysqli_nonapi.c
diff -u php-src/ext/mysqli/mysqli_nonapi.c:1.24 php-src/ext/mysqli/mysqli_nonapi.c:1.25
--- php-src/ext/mysqli/mysqli_nonapi.c:1.24 Sat Dec 13 11:08:13 2003
+++ php-src/ext/mysqli/mysqli_nonapi.c Wed Dec 31 03:34:02 2003
@@ -15,7 +15,7 @@
| Author: Georg Richter <[EMAIL PROTECTED]> |
+----------------------------------------------------------------------+
- $Id: mysqli_nonapi.c,v 1.24 2003/12/13 16:08:13 georg Exp $
+ $Id: mysqli_nonapi.c,v 1.25 2003/12/31 08:34:02 georg Exp $
*/
#ifdef HAVE_CONFIG_H
@@ -33,13 +33,14 @@
Open a connection to a mysql server */
PHP_FUNCTION(mysqli_connect)
{
- MYSQL *mysql;
+ MYSQL *mysql = NULL;
MYSQLI_RESOURCE *mysqli_resource;
zval *object = getThis();
char *hostname = NULL, *username=NULL,
*passwd=NULL, *dbname=NULL, *socket=NULL;
unsigned int hostname_len, username_len, passwd_len, dbname_len,
socket_len;
unsigned int port=0;
+
if (getThis() && !ZEND_NUM_ARGS()) {
RETURN_NULL();
}
@@ -89,6 +90,7 @@
MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_link_class_entry);
} else {
((mysqli_object *) zend_object_store_get_object(object
TSRMLS_CC))->ptr = mysqli_resource;
+ ((mysqli_object *) zend_object_store_get_object(object
TSRMLS_CC))->valid = 1;
}
}
/* }}} */
Index: php-src/ext/mysqli/mysqli_api.c
diff -u php-src/ext/mysqli/mysqli_api.c:1.57 php-src/ext/mysqli/mysqli_api.c:1.58
--- php-src/ext/mysqli/mysqli_api.c:1.57 Tue Dec 30 14:19:13 2003
+++ php-src/ext/mysqli/mysqli_api.c Wed Dec 31 03:34:02 2003
@@ -15,7 +15,7 @@
| Author: Georg Richter <[EMAIL PROTECTED]> |
+----------------------------------------------------------------------+
- $Id: mysqli_api.c,v 1.57 2003/12/30 19:19:13 georg Exp $
+ $Id: mysqli_api.c,v 1.58 2003/12/31 08:34:02 georg Exp $
*/
#ifdef HAVE_CONFIG_H
@@ -1136,7 +1136,6 @@
{
MYSQL_RES *result;
zval *mysql_result;
- ulong rc;
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O",
&mysql_result, mysqli_result_class_entry) == FAILURE) {
return;
@@ -1302,11 +1301,12 @@
Open a connection to a mysql server */
PHP_FUNCTION(mysqli_real_connect)
{
- MYSQL *mysql;
- char *hostname = NULL, *username=NULL, *passwd=NULL, *dbname=NULL,
*socket=NULL;
- unsigned int hostname_len, username_len, passwd_len, dbname_len, socket_len;
- unsigned int port=0, flags=0;
- zval *mysql_link;
+ MYSQL *mysql;
+ char *hostname = NULL, *username=NULL, *passwd=NULL,
*dbname=NULL, *socket=NULL;
+ unsigned int hostname_len, username_len, passwd_len, dbname_len, socket_len;
+ unsigned int port=0, flags=0;
+ zval *mysql_link;
+ zval *object = getThis();
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(),
"O|sssslsl", &mysql_link, mysqli_link_class_entry,
&hostname, &hostname_len, &username, &username_len, &passwd,
&passwd_len, &dbname, &dbname_len, &port, &socket, &socket_len,
@@ -1352,6 +1352,10 @@
}
php_mysqli_set_error(mysql_errno(mysql), (char *)mysql_error(mysql) TSRMLS_CC);
+ if (object) {
+ ((mysqli_object *) zend_object_store_get_object(object
TSRMLS_CC))->valid = 1;
+ }
+
RETURN_TRUE;
}
/* }}} */
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php