helly Sun Dec 28 11:26:06 2003 EDT Modified files: /php-src/ext/sqlite sqlite.c Log: Fix a memleak Improve error messages Index: php-src/ext/sqlite/sqlite.c diff -u php-src/ext/sqlite/sqlite.c:1.107 php-src/ext/sqlite/sqlite.c:1.108 --- php-src/ext/sqlite/sqlite.c:1.107 Sat Dec 27 17:16:13 2003 +++ php-src/ext/sqlite/sqlite.c Sun Dec 28 11:26:04 2003 @@ -17,7 +17,7 @@ | Marcus Boerger <[EMAIL PROTECTED]> | +----------------------------------------------------------------------+ - $Id: sqlite.c,v 1.107 2003/12/27 22:16:13 helly Exp $ + $Id: sqlite.c,v 1.108 2003/12/28 16:26:04 helly Exp $ */ #ifdef HAVE_CONFIG_H @@ -415,14 +415,13 @@ ZVAL_STRING(&funcname, (char*)argv[0], 1); if (!zend_make_callable(&funcname, &callable TSRMLS_CC)) { - spprintf(&errbuf, 0, "function `%s' is not funcname", callable); + spprintf(&errbuf, 0, "function `%s' is not a function name", callable); sqlite_set_result_error(func, errbuf, -1); efree(errbuf); efree(callable); zval_dtor(&funcname); return; } - efree(callable); if (argc > 1) { zargs = (zval ***)safe_emalloc((argc - 1), sizeof(zval **), 0); @@ -441,6 +440,7 @@ argc-1, zargs, 0, NULL TSRMLS_CC); + zval_dtor(&funcname); if (res == SUCCESS) { @@ -464,9 +464,14 @@ } } } else { - sqlite_set_result_error(func, "call_user_function_ex failed", -1); + char *errbuf; + spprintf(&errbuf, 0, "call_user_function_ex failed for function %s()", callable); + sqlite_set_result_error(func, errbuf, -1); + efree(errbuf); } + efree(callable); + if (retval) { zval_ptr_dtor(&retval); } @@ -1071,7 +1076,7 @@ { php_info_print_table_start(); php_info_print_table_header(2, "SQLite support", "enabled"); - php_info_print_table_row(2, "PECL Module version", PHP_SQLITE_MODULE_VERSION " $Id: sqlite.c,v 1.107 2003/12/27 22:16:13 helly Exp $"); + php_info_print_table_row(2, "PECL Module version", PHP_SQLITE_MODULE_VERSION " $Id: sqlite.c,v 1.108 2003/12/28 16:26:04 helly Exp $"); php_info_print_table_row(2, "SQLite Library", sqlite_libversion()); php_info_print_table_row(2, "SQLite Encoding", sqlite_libencoding()); php_info_print_table_end(); @@ -1451,9 +1456,9 @@ /* }}} */ /* {{{ sqlite_query */ -void sqlite_query(zval *object, struct php_sqlite_db *db, char *sql, long sql_len, int mode, int buffered, zval *return_value, struct php_sqlite_result *rres TSRMLS_DC) +void sqlite_query(zval *object, struct php_sqlite_db *db, char *sql, long sql_len, int mode, int buffered, zval *return_value, struct php_sqlite_result **prres TSRMLS_DC) { - struct php_sqlite_result res; + struct php_sqlite_result res, *rres; int ret; char *errtext = NULL; const char *tail; @@ -1475,17 +1480,22 @@ } } - if (!rres) { - rres = (struct php_sqlite_result*)emalloc(sizeof(*rres)); + if (!prres) { + rres = NULL; + prres = &rres; } - memcpy(rres, &res, sizeof(*rres)); - rres->db = db; + if (!*prres) { + *prres = (struct php_sqlite_result*)emalloc(sizeof(**prres)); + } + memcpy(*prres, &res, sizeof(**prres)); + (*prres)->db = db; zend_list_addref(db->rsrc_id); /* now the result set is ready for stepping: get first row */ - if (php_sqlite_fetch(rres TSRMLS_CC) != SQLITE_OK) { - real_result_dtor(rres TSRMLS_CC); + if (php_sqlite_fetch((*prres) TSRMLS_CC) != SQLITE_OK) { + real_result_dtor((*prres) TSRMLS_CC); + *prres = NULL; if (return_value) { RETURN_FALSE; } else { @@ -1493,7 +1503,7 @@ } } - rres->curr_row = 0; + (*prres)->curr_row = 0; if (object) { sqlite_object *obj; @@ -1504,9 +1514,9 @@ } obj = (sqlite_object *) zend_object_store_get_object(return_value TSRMLS_CC); obj->type = is_result; - obj->u.res = rres; + obj->u.res = (*prres); } else if (return_value) { - ZEND_REGISTER_RESOURCE(object ? NULL : return_value, rres, le_sqlite_result); + ZEND_REGISTER_RESOURCE(object ? NULL : return_value, (*prres), le_sqlite_result); } } /* }}} */ @@ -2015,9 +2025,11 @@ } rres = (struct php_sqlite_result *)emalloc(sizeof(*rres)); - sqlite_query(NULL, db, sql, sql_len, mode, 0, NULL, rres TSRMLS_CC); + sqlite_query(NULL, db, sql, sql_len, mode, 0, NULL, &rres TSRMLS_CC); if (db->last_err_code != SQLITE_OK) { - efree(rres); + if (rres) { + efree(rres); + } RETURN_FALSE; } @@ -2127,9 +2139,11 @@ } rres = (struct php_sqlite_result *)emalloc(sizeof(*rres)); - sqlite_query(NULL, db, sql, sql_len, PHPSQLITE_NUM, 0, NULL, rres TSRMLS_CC); + sqlite_query(NULL, db, sql, sql_len, PHPSQLITE_NUM, 0, NULL, &rres TSRMLS_CC); if (db->last_err_code != SQLITE_OK) { - efree(rres); + if (rres) { + efree(rres); + } RETURN_FALSE; }
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php