]> granicus.if.org Git - php/commitdiff
Add object initialization checks for sqlite3 classes
authorStanislav Malyshev <stas@php.net>
Sat, 26 Jul 2014 22:52:51 +0000 (15:52 -0700)
committerStanislav Malyshev <stas@php.net>
Sat, 26 Jul 2014 23:57:45 +0000 (16:57 -0700)
ext/sqlite3/sqlite3.c

index 0c9041ebfc378d68343182ac24a07a7c2d7e221b..33c855facf51448dc4ce070076eaf4fccfdd36ad 100644 (file)
@@ -54,7 +54,7 @@ static void php_sqlite3_error(php_sqlite3_db_object *db_obj, char *format, ...)
        vspprintf(&message, 0, format, arg);
        va_end(arg);
 
-       if (db_obj->exception) {
+       if (db_obj && db_obj->exception) {
                zend_throw_exception(zend_exception_get_default(TSRMLS_C), message, 0 TSRMLS_CC);
        } else {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", message);
@@ -67,11 +67,17 @@ static void php_sqlite3_error(php_sqlite3_db_object *db_obj, char *format, ...)
 /* }}} */
 
 #define SQLITE3_CHECK_INITIALIZED(db_obj, member, class_name) \
-       if (!(member)) { \
+       if (!(db_obj) || !(member)) { \
                php_sqlite3_error(db_obj, "The " #class_name " object has not been correctly initialised"); \
                RETURN_FALSE; \
        }
 
+#define SQLITE3_CHECK_INITIALIZED_STMT(member, class_name) \
+       if (!(member)) { \
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "The " #class_name " object has not been correctly initialised"); \
+               RETURN_FALSE; \
+       }
+
 /* {{{ PHP_INI
 */
 PHP_INI_BEGIN()
@@ -191,12 +197,14 @@ PHP_METHOD(sqlite3, close)
        }
 
        if (db_obj->initialised) {
-               zend_llist_clean(&(db_obj->free_list));
-               errcode = sqlite3_close(db_obj->db);
-               if (errcode != SQLITE_OK) {
-                       php_sqlite3_error(db_obj, "Unable to close database: %d, %s", errcode, sqlite3_errmsg(db_obj->db));
-                       RETURN_FALSE;
-               }
+        zend_llist_clean(&(db_obj->free_list));
+               if(db_obj->db) {
+            errcode = sqlite3_close(db_obj->db);
+            if (errcode != SQLITE_OK) {
+                           php_sqlite3_error(db_obj, "Unable to close database: %d, %s", errcode, sqlite3_errmsg(db_obj->db));
+                RETURN_FALSE;
+                   }
+        }
                db_obj->initialised = 0;
        }
 
@@ -1279,6 +1287,8 @@ PHP_METHOD(sqlite3stmt, paramCount)
                return;
        }
 
+       SQLITE3_CHECK_INITIALIZED_STMT(stmt_obj->stmt, SQLite3Stmt);
+
        RETURN_LONG(sqlite3_bind_parameter_count(stmt_obj->stmt));
 }
 /* }}} */
@@ -1295,7 +1305,9 @@ PHP_METHOD(sqlite3stmt, close)
                return;
        }
 
-       zend_llist_del_element(&(stmt_obj->db_obj->free_list), object, (int (*)(void *, void *)) php_sqlite3_compare_stmt_zval_free);
+       if(stmt_obj->db_obj) {
+               zend_llist_del_element(&(stmt_obj->db_obj->free_list), object, (int (*)(void *, void *)) php_sqlite3_compare_stmt_zval_free);
+       }
 
        RETURN_TRUE;
 }
@@ -1313,6 +1325,8 @@ PHP_METHOD(sqlite3stmt, reset)
                return;
        }
 
+       SQLITE3_CHECK_INITIALIZED_STMT(stmt_obj->stmt, SQLite3Stmt);
+
        if (sqlite3_reset(stmt_obj->stmt) != SQLITE_OK) {
                php_sqlite3_error(stmt_obj->db_obj, "Unable to reset statement: %s", sqlite3_errmsg(sqlite3_db_handle(stmt_obj->stmt)));
                RETURN_FALSE;
@@ -1333,6 +1347,8 @@ PHP_METHOD(sqlite3stmt, clear)
                return;
        }
 
+       SQLITE3_CHECK_INITIALIZED_STMT(stmt_obj->stmt, SQLite3Stmt);
+
        if (sqlite3_clear_bindings(stmt_obj->stmt) != SQLITE_OK) {
                php_sqlite3_error(stmt_obj->db_obj, "Unable to clear statement: %s", sqlite3_errmsg(sqlite3_db_handle(stmt_obj->stmt)));
                RETURN_FALSE;
@@ -1354,6 +1370,8 @@ PHP_METHOD(sqlite3stmt, readOnly)
                return;
        }
 
+       SQLITE3_CHECK_INITIALIZED_STMT(stmt_obj->stmt, SQLite3Stmt);
+
 #if SQLITE_VERSION_NUMBER >= 3007004
        if (sqlite3_stmt_readonly(stmt_obj->stmt)) {
                RETURN_TRUE;
@@ -1426,6 +1444,8 @@ PHP_METHOD(sqlite3stmt, bindParam)
                }
        }
 
+       SQLITE3_CHECK_INITIALIZED_STMT(stmt_obj->stmt, SQLite3Stmt);
+
        Z_ADDREF_P(param.parameter);
 
        if (!register_bound_parameter_to_sqlite(&param, stmt_obj TSRMLS_CC)) {
@@ -1457,6 +1477,8 @@ PHP_METHOD(sqlite3stmt, bindValue)
                }
        }
 
+       SQLITE3_CHECK_INITIALIZED_STMT(stmt_obj->stmt, SQLite3Stmt);
+
        Z_ADDREF_P(param.parameter);
 
        if (!register_bound_parameter_to_sqlite(&param, stmt_obj TSRMLS_CC)) {