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

Reply via email to