]> granicus.if.org Git - php/commitdiff
Change things to allow passing of the password length
authorAndrey Hristov <andrey@php.net>
Fri, 14 Jan 2011 13:00:42 +0000 (13:00 +0000)
committerAndrey Hristov <andrey@php.net>
Fri, 14 Jan 2011 13:00:42 +0000 (13:00 +0000)
to mysqlnd. This is needed as a password might include
a \0 and thus we need to be binary safe.

ext/mysqli/mysqli_api.c
ext/mysqli/mysqli_libmysql.h
ext/mysqli/mysqli_mysqlnd.h
ext/mysqli/mysqli_nonapi.c
ext/mysqlnd/mysqlnd.c
ext/mysqlnd/mysqlnd.h
ext/mysqlnd/mysqlnd_auth.c
ext/mysqlnd/mysqlnd_structs.h

index c75c9f8ec2d2a1014e30fa3c88c4c52c48f4a060..724c1e0ab247b921ec21d5a8506291c5b2912991 100644 (file)
@@ -535,7 +535,11 @@ PHP_FUNCTION(mysqli_change_user)
        old_charset = mysql->mysql->charset;
 #endif
 
+#if defined(MYSQLI_USE_MYSQLND)
+       rc = mysqlnd_change_user_ex(mysql->mysql, user, password, dbname, FALSE, (size_t) password_len);
+#else
        rc = mysql_change_user(mysql->mysql, user, password, dbname);
+#endif
        MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql);
 
        if (rc) {
index ca6770af11c0cce13622eec7ccf29ef2166c6b31..3ec06cdd0829f08d8567b5e9687518a1499ee56a 100644 (file)
@@ -38,7 +38,7 @@
 #define mysqli_close(c, is_forced)                     mysql_close((c))
 #define mysqli_stmt_close(c, implicit)         mysql_stmt_close((c))
 #define mysqli_free_result(r, is_forced)       mysql_free_result((r))
-#define mysqli_change_user_silent(c, u, p, d)   mysql_change_user((c), (u), (p), (d))
+#define mysqli_change_user_silent(c, u, p, d, p_len)   mysql_change_user((c), (u), (p), (d))
 
 
 /*
index 3072835c55d371df2a22ebc8c62fe8fc2133bb2d..e4e06daeaa0408377ffd26b6865692a14138ab29 100644 (file)
@@ -40,7 +40,7 @@
 #define mysqli_stmt_close(c, implicit) mysqlnd_stmt_close((c), (implicit))
 #define mysqli_free_result(r, implicit)        mysqlnd_free_result((r), (implicit))
 #define mysqli_async_query(c, q, l)            mysqlnd_async_query((c), (q), (l))
-#define mysqli_change_user_silent(c, u, p, d)   mysqlnd_change_user((c), (u), (p), (d), TRUE)
+#define mysqli_change_user_silent(c, u, p, d, p_len)   mysqlnd_change_user_ex((c), (u), (p), (d), TRUE, (size_t)(p_len))
 
 #define HAVE_STMT_NEXT_RESULT
 
index 04755df22492583a26a2fe4affeba40fa288d8eb..11c0618c49f1bb0c2938bea5480f80e3bc95375a 100644 (file)
@@ -172,7 +172,7 @@ void mysqli_common_connect(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_real_conne
                                                        /* reset variables */
 
 #ifndef MYSQLI_NO_CHANGE_USER_ON_PCONNECT
-                                                       if (!mysqli_change_user_silent(mysql->mysql, username, passwd, dbname)) {
+                                                       if (!mysqli_change_user_silent(mysql->mysql, username, passwd, dbname, passwd_len)) {
 #else
                                                        if (!mysql_ping(mysql->mysql)) {
 #endif
index 94cd5b89a88fd294456daa3c7079d1e13d6679f2..abf33e178833daee795e557e9c6eac11f4133c94 100644 (file)
@@ -497,6 +497,7 @@ mysqlnd_connect_run_authentication(
                        const char * const passwd,
                        const char * const db,
                        size_t db_len,
+                       size_t passwd_len,
                        const MYSQLND_PACKET_GREET * const greet_packet,
                        const MYSQLND_OPTIONS * const options,
                        unsigned long mysql_flags
@@ -530,7 +531,7 @@ mysqlnd_connect_run_authentication(
 
                        DBG_INF("plugin found");
 
-                       ret = auth_plugin->methods.auth_handshake(conn, user, passwd, db, db_len, greet_packet, options, mysql_flags,
+                       ret = auth_plugin->methods.auth_handshake(conn, user, passwd, db, db_len, passwd_len, greet_packet, options, mysql_flags,
                                                                                                          &switch_to_auth_protocol TSRMLS_CC);
                        DBG_INF_FMT("switch_to_auth_protocol=%s", switch_to_auth_protocol? switch_to_auth_protocol:"n/a");
                } while (ret == FAIL && switch_to_auth_protocol != NULL);
@@ -729,7 +730,9 @@ MYSQLND_METHOD(mysqlnd_conn, connect)(MYSQLND * conn,
        }
 #endif
 
-       if (FAIL == mysqlnd_connect_run_authentication(conn, user, passwd, db, db_len, greet_packet, &conn->options, mysql_flags TSRMLS_CC)) {
+       if (FAIL == mysqlnd_connect_run_authentication(conn, user, passwd, db, db_len, (size_t) passwd_len,
+                                                                                                  greet_packet, &conn->options, mysql_flags TSRMLS_CC))
+       {
                goto err;
        }
 
@@ -1912,7 +1915,9 @@ MYSQLND_METHOD(mysqlnd_conn, change_user)(MYSQLND * const conn,
                                                                                  const char *user,
                                                                                  const char *passwd,
                                                                                  const char *db,
-                                                                                 zend_bool silent TSRMLS_DC)
+                                                                                 zend_bool silent,
+                                                                                 size_t passwd_len
+                                                                                 TSRMLS_DC)
 {
        /*
          User could be max 16 * 3 (utf8), pass is 20 usually, db is up to 64*3
@@ -1962,7 +1967,7 @@ MYSQLND_METHOD(mysqlnd_conn, change_user)(MYSQLND * const conn,
                                break;
                        }       
                        DBG_INF("plugin found");
-                       ret = auth_plugin->methods.auth_change_user(conn, user, strlen(user), passwd, db, strlen(db), silent, &switch_to_auth_protocol TSRMLS_CC);
+                       ret = auth_plugin->methods.auth_change_user(conn, user, strlen(user), passwd, db, strlen(db), passwd_len, silent, &switch_to_auth_protocol TSRMLS_CC);
                        DBG_INF_FMT("switch_to_auth_protocol=%s", switch_to_auth_protocol? switch_to_auth_protocol:"n/a");
                } while (ret == FAIL && switch_to_auth_protocol != NULL);
                if (ret == PASS) {
index bb5e3996581479c365d88d10d319d8ded17af502..6dbec7171f1d10d608325282e544f42dda6b1920 100644 (file)
@@ -115,7 +115,8 @@ PHPAPI MYSQLND * mysqlnd_connect(MYSQLND *conn,
                                                  unsigned int mysql_flags
                                                  TSRMLS_DC);
 
-#define mysqlnd_change_user(conn, user, passwd, db, silent)            (conn)->m->change_user((conn), (user), (passwd), (db), (silent) TSRMLS_CC)
+#define mysqlnd_change_user(conn, user, passwd, db, silent)            (conn)->m->change_user((conn), (user), (passwd), (db), (silent), strlen((passwd)) TSRMLS_CC)
+#define mysqlnd_change_user_ex(conn, user, passwd, db, silent, passwd_len)             (conn)->m->change_user((conn), (user), (passwd), (db), (silent), (passwd_len) TSRMLS_CC)
 
 #define mysqlnd_debug(x)                                                               _mysqlnd_debug((x) TSRMLS_CC)
 PHPAPI void _mysqlnd_debug(const char *mode TSRMLS_DC);
index cc360cb6dec2226fe89669cf562bb83d4942a1a7..ccf935355e599ef7c67ba360b479a3aab3343aee 100644 (file)
@@ -36,6 +36,7 @@ mysqlnd_native_auth_handshake(MYSQLND * conn,
                                                          const char * const passwd,
                                                          const char * const db,
                                                          const size_t db_len,
+                                                         const size_t passwd_len,
                                                          const MYSQLND_PACKET_GREET * const greet_packet,
                                                          const MYSQLND_OPTIONS * const options,
                                                          unsigned long mysql_flags,
@@ -132,6 +133,7 @@ mysqlnd_native_auth_change_user(MYSQLND * const conn,
                                                                const char * const passwd,
                                                                const char * const db,
                                                                const size_t db_len,
+                                                               const size_t passwd_len,
                                                                const zend_bool silent,
                                                                char ** switch_to_auth_protocol
                                                                TSRMLS_DC)
index 5ba2f4c68f1d4654e22d538315a9f92f0e6dfae6..59c7fdc8548d27a45a238adde4ffd510094f06fe 100644 (file)
@@ -300,6 +300,7 @@ struct st_mysqlnd_packet_row;
 struct st_mysqlnd_packet_stats;
 struct st_mysqlnd_packet_prepare_response;
 struct st_mysqlnd_packet_chg_user_resp;
+struct st_mysqlnd_packet_auth_pam;
 
 typedef struct st_mysqlnd_packet_greet *               (*func_mysqlnd_protocol__get_greet_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC);
 typedef struct st_mysqlnd_packet_auth *                        (*func_mysqlnd_protocol__get_auth_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC);
@@ -357,7 +358,7 @@ typedef enum_func_status    (*func_mysqlnd_conn__ping)(MYSQLND * const conn TSRMLS_
 typedef enum_func_status       (*func_mysqlnd_conn__kill_connection)(MYSQLND *conn, unsigned int pid TSRMLS_DC);
 typedef enum_func_status       (*func_mysqlnd_conn__select_db)(MYSQLND * const conn, const char * const db, unsigned int db_len TSRMLS_DC);
 typedef enum_func_status       (*func_mysqlnd_conn__server_dump_debug_information)(MYSQLND * const conn TSRMLS_DC);
-typedef enum_func_status       (*func_mysqlnd_conn__change_user)(MYSQLND * const conn, const char * user, const char * passwd, const char * db, zend_bool silent TSRMLS_DC);
+typedef enum_func_status       (*func_mysqlnd_conn__change_user)(MYSQLND * const conn, const char * user, const char * passwd, const char * db, zend_bool silent, size_t passwd_len TSRMLS_DC);
 
 typedef unsigned int           (*func_mysqlnd_conn__get_error_no)(const MYSQLND * const conn TSRMLS_DC);
 typedef const char *           (*func_mysqlnd_conn__get_error_str)(const MYSQLND * const conn TSRMLS_DC);
@@ -970,12 +971,12 @@ struct st_mysqlnd_authentication_plugin
        struct st_mysqlnd_plugin_header plugin_header;
        struct {
                enum_func_status (*auth_handshake)(MYSQLND * conn, const char * const user, const char * const passwd, const char * const db,
-                                                                                  const size_t db_len, const struct st_mysqlnd_packet_greet * const greet_packet,
+                                                                                  const size_t db_len, const size_t passwd_len, const struct st_mysqlnd_packet_greet * const greet_packet,
                                                                                   const MYSQLND_OPTIONS * const options, unsigned long mysql_flags,
                                                                                   char ** switch_to_auth_protocol TSRMLS_DC);
 
                enum_func_status (*auth_change_user)(MYSQLND * const conn, const char * const user, const size_t user_len, const char * const passwd,
-                                                                                        const char * const db, const size_t db_len, const zend_bool silent,
+                                                                                        const char * const db, const size_t db_len, const size_t passwd_len, const zend_bool silent,
                                                                                         char ** switch_to_auth_protocol TSRMLS_DC);
        } methods;
 };