]> granicus.if.org Git - php/commitdiff
Init should return status value because initialization can fail.
authorAndrey Hristov <andrey@php.net>
Tue, 25 May 2010 22:40:47 +0000 (22:40 +0000)
committerAndrey Hristov <andrey@php.net>
Tue, 25 May 2010 22:40:47 +0000 (22:40 +0000)
In this case mysqlnd_init() should return NULL to the end-user.

ext/mysqlnd/mysqlnd.c
ext/mysqlnd/mysqlnd_structs.h

index a13ea42a30ad39e8a873cfe20314456c040c5efc..a9356dafc5ff3b022ca064f1fbdac07e173739a6 100644 (file)
@@ -2140,7 +2140,7 @@ MYSQLND_METHOD(mysqlnd_conn, get_connection_stats)(const MYSQLND * const conn,
 
 
 MYSQLND_STMT * _mysqlnd_stmt_init(MYSQLND * const conn TSRMLS_DC);
-static void MYSQLND_METHOD(mysqlnd_conn, init)(MYSQLND * conn TSRMLS_DC);
+static enum_func_status MYSQLND_METHOD(mysqlnd_conn, init)(MYSQLND * conn TSRMLS_DC);
 
 static
 MYSQLND_CLASS_METHODS_START(mysqlnd_conn)
@@ -2217,17 +2217,17 @@ MYSQLND_CLASS_METHODS_END;
 
 
 /* {{{ mysqlnd_conn::init */
-static void
+static enum_func_status
 MYSQLND_METHOD(mysqlnd_conn, init)(MYSQLND * conn TSRMLS_DC)
 {
        DBG_ENTER("mysqlnd_conn::init");
-       conn->net = mysqlnd_net_init(conn->persistent TSRMLS_CC);
-       conn->protocol = mysqlnd_protocol_init(conn->persistent TSRMLS_CC);
        mysqlnd_stats_init(&conn->stats, STAT_LAST);
-
        SET_ERROR_AFF_ROWS(conn);
 
-       DBG_VOID_RETURN;
+       conn->net = mysqlnd_net_init(conn->persistent TSRMLS_CC);
+       conn->protocol = mysqlnd_protocol_init(conn->persistent TSRMLS_CC);
+
+       DBG_RETURN(conn->net && conn->protocol? PASS:FAIL);
 }
 /* }}} */
 
@@ -2249,7 +2249,10 @@ PHPAPI MYSQLND * _mysqlnd_init(zend_bool persistent TSRMLS_DC)
        CONN_SET_STATE(ret, CONN_ALLOCED);
        ret->m->get_reference(ret TSRMLS_CC);
 
-       ret->m->init(ret TSRMLS_CC);
+       if (PASS != ret->m->init(ret TSRMLS_CC)) {
+               ret->m->dtor(ret TSRMLS_CC);
+               ret = NULL;
+       }
 
        DBG_RETURN(ret);
 }
index 0a2c928495f22116d2a7f073269445ce2fdf688b..de08a7f1b16d627908030bbd9450a1520c354db4 100644 (file)
@@ -334,7 +334,7 @@ struct st_mysqlnd_protocol_methods
 
 
 
-typedef void                           (*func_mysqlnd_conn__init)(MYSQLND * conn TSRMLS_DC);
+typedef enum_func_status       (*func_mysqlnd_conn__init)(MYSQLND * conn TSRMLS_DC);
 typedef enum_func_status       (*func_mysqlnd_conn__connect)(MYSQLND *conn, const char *host, const char * user, const char * passwd, unsigned int passwd_len, const char * db, unsigned int db_len, unsigned int port, const char * socket, unsigned int mysql_flags TSRMLS_DC);
 typedef ulong                          (*func_mysqlnd_conn__escape_string)(const MYSQLND * const conn, char *newstr, const char *escapestr, size_t escapestr_len TSRMLS_DC);
 typedef enum_func_status       (*func_mysqlnd_conn__set_charset)(MYSQLND * const conn, const char * const charset TSRMLS_DC);