Skip to content

Commit e81ecc8

Browse files
committed
MNDR:
- Move transport string generation to own function, which can be overloaded or sniffed
1 parent 51085da commit e81ecc8

File tree

3 files changed

+78
-55
lines changed

3 files changed

+78
-55
lines changed

ext/mysqlnd/mysqlnd.c

Lines changed: 63 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -695,6 +695,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, get_updated_connect_flags)(MYSQLND_CONN_DATA *
695695
/* {{{ mysqlnd_conn_data::connect_handshake */
696696
static enum_func_status
697697
MYSQLND_METHOD(mysqlnd_conn_data, connect_handshake)(MYSQLND_CONN_DATA * conn,
698+
const MYSQLND_CSTRING * const scheme,
698699
const MYSQLND_CSTRING * const username,
699700
const MYSQLND_CSTRING * const password,
700701
const MYSQLND_CSTRING * const database,
@@ -704,7 +705,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, connect_handshake)(MYSQLND_CONN_DATA * conn,
704705
size_t client_flags = mysql_flags;
705706
DBG_ENTER("mysqlnd_conn_data::connect_handshake");
706707

707-
if (FAIL == conn->net->data->m.connect_ex(conn->net, conn->scheme, conn->persistent, conn->stats, conn->error_info)) {
708+
if (FAIL == conn->net->data->m.connect_ex(conn->net, *scheme, conn->persistent, conn->stats, conn->error_info)) {
708709
DBG_RETURN(FAIL);
709710
} else {
710711
struct st_mysqlnd_protocol_command * command = conn->command_factory(COM_HANDSHAKE, conn, username, password, database, client_flags);
@@ -717,6 +718,42 @@ MYSQLND_METHOD(mysqlnd_conn_data, connect_handshake)(MYSQLND_CONN_DATA * conn,
717718
}
718719
/* }}} */
719720

721+
/* {{{ mysqlnd_conn_data::connect */
722+
static MYSQLND_STRING
723+
MYSQLND_METHOD(mysqlnd_conn_data, get_scheme)(MYSQLND_CONN_DATA * conn, MYSQLND_CSTRING hostname, MYSQLND_CSTRING socket_or_pipe, unsigned int port, zend_bool * unix_socket, zend_bool * named_pipe)
724+
{
725+
MYSQLND_STRING transport;
726+
DBG_ENTER("mysqlnd_conn_data::get_scheme");
727+
#ifndef PHP_WIN32
728+
if (hostname.l == sizeof("localhost") - 1 && !strncasecmp(hostname.s, "localhost", hostname.l)) {
729+
DBG_INF_FMT("socket=%s", socket_or_pipe.s? socket_or_pipe.s:"n/a");
730+
if (!socket_or_pipe.s) {
731+
socket_or_pipe.s = "/tmp/mysql.sock";
732+
socket_or_pipe.l = strlen(socket_or_pipe.s);
733+
}
734+
transport.l = mnd_sprintf(&transport.s, 0, "unix://%s", socket_or_pipe.s);
735+
*unix_socket = TRUE;
736+
#else
737+
if (hostname.l == sizeof(".") - 1 && hostname.s[0] == '.') {
738+
/* named pipe in socket */
739+
if (!socket_or_pipe.s) {
740+
socket_or_pipe.s = "\\\\.\\pipe\\MySQL";
741+
socket_or_pipe.l = strlen(socket_or_pipe.s);
742+
}
743+
transport.l = mnd_sprintf(&transport.s, 0, "pipe://%s", socket_or_pipe.s);
744+
*named_pipe = TRUE;
745+
#endif
746+
} else {
747+
if (!port) {
748+
port = 3306;
749+
}
750+
transport.l = mnd_sprintf(&transport.s, 0, "tcp://%s:%u", hostname.s, port);
751+
}
752+
DBG_INF_FMT("transport=%s", transport.s? transport.s:"OOM");
753+
DBG_RETURN(transport);
754+
}
755+
/* }}} */
756+
720757

721758
/* {{{ mysqlnd_conn_data::connect */
722759
static enum_func_status
@@ -737,6 +774,9 @@ MYSQLND_METHOD(mysqlnd_conn_data, connect)(MYSQLND_CONN_DATA * conn,
737774
zend_bool saved_compression = FALSE;
738775
zend_bool local_tx_started = FALSE;
739776
MYSQLND_NET * net = conn->net;
777+
MYSQLND_STRING transport = { NULL, 0 };
778+
// char * transport = NULL;
779+
// int transport_len;
740780

741781
DBG_ENTER("mysqlnd_conn_data::connect");
742782
DBG_INF_FMT("conn=%p", conn);
@@ -803,53 +843,13 @@ MYSQLND_METHOD(mysqlnd_conn_data, connect)(MYSQLND_CONN_DATA * conn,
803843
mysql_flags |= CLIENT_CONNECT_WITH_DB;
804844
}
805845

806-
{
807-
char * transport = NULL;
808-
int transport_len;
809-
#ifndef PHP_WIN32
810-
if (hostname.l == sizeof("localhost") - 1 && !strncasecmp(hostname.s, "localhost", hostname.l)) {
811-
DBG_INF_FMT("socket=%s", socket_or_pipe.s? socket_or_pipe.s:"n/a");
812-
if (!socket_or_pipe.s) {
813-
socket_or_pipe.s = "/tmp/mysql.sock";
814-
socket_or_pipe.l = strlen(socket_or_pipe.s);
815-
}
816-
transport_len = mnd_sprintf(&transport, 0, "unix://%s", socket_or_pipe.s);
817-
unix_socket = TRUE;
818-
#else
819-
if (hostname.l == sizeof(".") - 1 && hostname.s[0] == '.') {
820-
/* named pipe in socket */
821-
if (!socket_or_pipe.s) {
822-
socket_or_pipe.s = "\\\\.\\pipe\\MySQL";
823-
socket_or_pipe.l = strlen(socket_or_pipe.s);
824-
}
825-
transport_len = mnd_sprintf(&transport, 0, "pipe://%s", socket_or_pipe.s);
826-
named_pipe = TRUE;
827-
#endif
828-
} else {
829-
if (!port) {
830-
port = 3306;
831-
}
832-
transport_len = mnd_sprintf(&transport, 0, "tcp://%s:%u", hostname.s, port);
833-
}
834-
if (!transport) {
835-
SET_OOM_ERROR(conn->error_info);
836-
goto err; /* OOM */
837-
}
838-
DBG_INF_FMT("transport=%s conn->scheme=%s", transport, conn->scheme.s);
839-
conn->scheme.s = mnd_pestrndup(transport, transport_len, conn->persistent);
840-
conn->scheme.l = transport_len;
841-
mnd_sprintf_free(transport);
842-
transport = NULL;
843-
if (!conn->scheme.s) {
844-
goto err; /* OOM */
845-
}
846-
}
846+
transport = conn->m->get_scheme(conn, hostname, socket_or_pipe, port, &unix_socket, &named_pipe);
847847

848848
mysql_flags = conn->m->get_updated_connect_flags(conn, mysql_flags);
849849

850850
{
851-
852-
if (FAIL == conn->m->connect_handshake(conn, &username, &password, &database, mysql_flags)) {
851+
const MYSQLND_CSTRING scheme = { transport.s, transport.l };
852+
if (FAIL == conn->m->connect_handshake(conn, &scheme, &username, &password, &database, mysql_flags)) {
853853
goto err;
854854
}
855855
}
@@ -867,6 +867,18 @@ MYSQLND_METHOD(mysqlnd_conn_data, connect)(MYSQLND_CONN_DATA * conn,
867867
*/
868868
net->data->compressed = mysql_flags & CLIENT_COMPRESS? TRUE:FALSE;
869869

870+
871+
conn->scheme.s = mnd_pestrndup(transport.s, transport.l, conn->persistent);
872+
conn->scheme.l = transport.l;
873+
if (transport.s) {
874+
mnd_sprintf_free(transport.s);
875+
transport.s = NULL;
876+
}
877+
878+
if (!conn->scheme.s) {
879+
goto err; /* OOM */
880+
}
881+
870882
conn->user_len = username.l;
871883
conn->user = mnd_pestrndup(username.s, conn->user_len, conn->persistent);
872884
conn->passwd = mnd_pestrndup(password.s, password.l, conn->persistent);
@@ -952,6 +964,10 @@ MYSQLND_METHOD(mysqlnd_conn_data, connect)(MYSQLND_CONN_DATA * conn,
952964
DBG_RETURN(PASS);
953965
}
954966
err:
967+
if (transport.s) {
968+
mnd_sprintf_free(transport.s);
969+
transport.s = NULL;
970+
}
955971

956972
DBG_ERR_FMT("[%u] %.128s (trying to connect via %s)", conn->error_info->error_no, conn->error_info->error, conn->scheme.s);
957973
if (!conn->error_info->error_no) {
@@ -2810,7 +2826,9 @@ MYSQLND_CLASS_METHODS_START(mysqlnd_conn_data)
28102826
MYSQLND_METHOD(mysqlnd_conn_data, set_client_option_2d),
28112827

28122828
MYSQLND_METHOD(mysqlnd_conn_data, negotiate_client_api_capabilities),
2813-
MYSQLND_METHOD(mysqlnd_conn_data, get_client_api_capabilities)
2829+
MYSQLND_METHOD(mysqlnd_conn_data, get_client_api_capabilities),
2830+
2831+
MYSQLND_METHOD(mysqlnd_conn_data, get_scheme)
28142832
MYSQLND_CLASS_METHODS_END;
28152833

28162834

ext/mysqlnd/mysqlnd_net.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ MYSQLND_METHOD(mysqlnd_net, network_write_ex)(MYSQLND_NET * const net, const zen
129129

130130
/* {{{ mysqlnd_net::open_pipe */
131131
static php_stream *
132-
MYSQLND_METHOD(mysqlnd_net, open_pipe)(MYSQLND_NET * const net, const MYSQLND_STRING scheme, const zend_bool persistent,
132+
MYSQLND_METHOD(mysqlnd_net, open_pipe)(MYSQLND_NET * const net, const MYSQLND_CSTRING scheme, const zend_bool persistent,
133133
MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info)
134134
{
135135
#if PHP_API_VERSION < 20100412
@@ -168,7 +168,7 @@ MYSQLND_METHOD(mysqlnd_net, open_pipe)(MYSQLND_NET * const net, const MYSQLND_ST
168168

169169
/* {{{ mysqlnd_net::open_tcp_or_unix */
170170
static php_stream *
171-
MYSQLND_METHOD(mysqlnd_net, open_tcp_or_unix)(MYSQLND_NET * const net, const MYSQLND_STRING scheme, const zend_bool persistent,
171+
MYSQLND_METHOD(mysqlnd_net, open_tcp_or_unix)(MYSQLND_NET * const net, const MYSQLND_CSTRING scheme, const zend_bool persistent,
172172
MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info)
173173
{
174174
#if PHP_API_VERSION < 20100412
@@ -263,7 +263,7 @@ MYSQLND_METHOD(mysqlnd_net, open_tcp_or_unix)(MYSQLND_NET * const net, const MYS
263263

264264
/* {{{ mysqlnd_net::post_connect_set_opt */
265265
static void
266-
MYSQLND_METHOD(mysqlnd_net, post_connect_set_opt)(MYSQLND_NET * const net, const MYSQLND_STRING scheme,
266+
MYSQLND_METHOD(mysqlnd_net, post_connect_set_opt)(MYSQLND_NET * const net, const MYSQLND_CSTRING scheme,
267267
MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info)
268268
{
269269
php_stream * net_stream = net->data->m.get_stream(net);
@@ -292,7 +292,7 @@ MYSQLND_METHOD(mysqlnd_net, post_connect_set_opt)(MYSQLND_NET * const net, const
292292

293293
/* {{{ mysqlnd_net::get_open_stream */
294294
static func_mysqlnd_net__open_stream
295-
MYSQLND_METHOD(mysqlnd_net, get_open_stream)(MYSQLND_NET * const net, const MYSQLND_STRING scheme,
295+
MYSQLND_METHOD(mysqlnd_net, get_open_stream)(MYSQLND_NET * const net, const MYSQLND_CSTRING scheme,
296296
MYSQLND_ERROR_INFO * const error_info)
297297
{
298298
func_mysqlnd_net__open_stream ret = NULL;
@@ -317,7 +317,7 @@ MYSQLND_METHOD(mysqlnd_net, get_open_stream)(MYSQLND_NET * const net, const MYSQ
317317

318318
/* {{{ mysqlnd_net::connect_ex */
319319
static enum_func_status
320-
MYSQLND_METHOD(mysqlnd_net, connect_ex)(MYSQLND_NET * const net, const MYSQLND_STRING scheme, const zend_bool persistent,
320+
MYSQLND_METHOD(mysqlnd_net, connect_ex)(MYSQLND_NET * const net, const MYSQLND_CSTRING scheme, const zend_bool persistent,
321321
MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info)
322322
{
323323
enum_func_status ret = FAIL;

ext/mysqlnd/mysqlnd_structs.h

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -338,13 +338,13 @@ typedef size_t (*func_mysqlnd_net__send_ex)(MYSQLND_NET * const net, zend_uch
338338
typedef enum_func_status (*func_mysqlnd_net__receive_ex)(MYSQLND_NET * const net, zend_uchar * const buffer, const size_t count, MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info);
339339
typedef enum_func_status (*func_mysqlnd_net__init)(MYSQLND_NET * const net, MYSQLND_STATS * const stats, MYSQLND_ERROR_INFO * const error_info);
340340
typedef void (*func_mysqlnd_net__dtor)(MYSQLND_NET * const net, MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info);
341-
typedef enum_func_status (*func_mysqlnd_net__connect_ex)(MYSQLND_NET * const net, const MYSQLND_STRING scheme, const zend_bool persistent, MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info);
341+
typedef enum_func_status (*func_mysqlnd_net__connect_ex)(MYSQLND_NET * const net, const MYSQLND_CSTRING scheme, const zend_bool persistent, MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info);
342342
typedef void (*func_mysqlnd_net__close_stream)(MYSQLND_NET * const net, MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info);
343-
typedef php_stream * (*func_mysqlnd_net__open_stream)(MYSQLND_NET * const net, const MYSQLND_STRING scheme, const zend_bool persistent, MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info);
343+
typedef php_stream * (*func_mysqlnd_net__open_stream)(MYSQLND_NET * const net, const MYSQLND_CSTRING scheme, const zend_bool persistent, MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info);
344344
typedef php_stream * (*func_mysqlnd_net__get_stream)(const MYSQLND_NET * const net);
345345
typedef php_stream * (*func_mysqlnd_net__set_stream)(MYSQLND_NET * const net, php_stream * net_stream);
346-
typedef func_mysqlnd_net__open_stream (*func_mysqlnd_net__get_open_stream)(MYSQLND_NET * const net, const MYSQLND_STRING scheme, MYSQLND_ERROR_INFO * const error_info);
347-
typedef void (*func_mysqlnd_net__post_connect_set_opt)(MYSQLND_NET * const net, const MYSQLND_STRING scheme, MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info);
346+
typedef func_mysqlnd_net__open_stream (*func_mysqlnd_net__get_open_stream)(MYSQLND_NET * const net, const MYSQLND_CSTRING scheme, MYSQLND_ERROR_INFO * const error_info);
347+
typedef void (*func_mysqlnd_net__post_connect_set_opt)(MYSQLND_NET * const net, const MYSQLND_CSTRING scheme, MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info);
348348
typedef enum_func_status (*func_mysqlnd_net__read_compressed_packet_from_stream_and_fill_read_buffer)(MYSQLND_NET * net, size_t net_payload_size, MYSQLND_STATS * conn_stats, MYSQLND_ERROR_INFO * error_info);
349349

350350
MYSQLND_CLASS_METHODS_TYPE(mysqlnd_net)
@@ -539,7 +539,7 @@ typedef enum_func_status (*func_mysqlnd_conn_data__local_tx_start)(MYSQLND_CONN_
539539
typedef enum_func_status (*func_mysqlnd_conn_data__local_tx_end)(MYSQLND_CONN_DATA * conn, size_t this_func, enum_func_status status);
540540
typedef enum_func_status (*func_mysqlnd_conn_data__execute_init_commands)(MYSQLND_CONN_DATA * conn);
541541
typedef unsigned int (*func_mysqlnd_conn_data__get_updated_connect_flags)(MYSQLND_CONN_DATA * conn, unsigned int mysql_flags);
542-
typedef enum_func_status (*func_mysqlnd_conn_data__connect_handshake)(MYSQLND_CONN_DATA * conn, const MYSQLND_CSTRING * const username, const MYSQLND_CSTRING * const password, const MYSQLND_CSTRING * const database, const unsigned int mysql_flags);
542+
typedef enum_func_status (*func_mysqlnd_conn_data__connect_handshake)(MYSQLND_CONN_DATA * conn, const MYSQLND_CSTRING * const scheme, const MYSQLND_CSTRING * const username, const MYSQLND_CSTRING * const password, const MYSQLND_CSTRING * const database, const unsigned int mysql_flags);
543543
typedef struct st_mysqlnd_authentication_plugin * (*func_mysqlnd_conn_data__fetch_auth_plugin_by_name)(const char * const requested_protocol);
544544

545545
typedef enum_func_status (*func_mysqlnd_conn_data__set_client_option_2d)(MYSQLND_CONN_DATA * const conn, enum_mysqlnd_client_option option, const char * const key, const char * const value);
@@ -548,6 +548,9 @@ typedef enum_func_status (*func_mysqlnd_conn_data__set_client_option_2d)(MYSQLND
548548
typedef unsigned int (*func_mysqlnd_conn_data__negotiate_client_api_capabilities)(MYSQLND_CONN_DATA * const conn, const unsigned int flags);
549549
typedef unsigned int (*func_mysqlnd_conn_data__get_client_api_capabilities)(const MYSQLND_CONN_DATA * const conn);
550550

551+
typedef MYSQLND_STRING (*func_mysqlnd_conn_data__get_scheme)(MYSQLND_CONN_DATA * conn, MYSQLND_CSTRING hostname, MYSQLND_CSTRING socket_or_pipe, unsigned int port, zend_bool * unix_socket, zend_bool * named_pipe);
552+
553+
551554

552555
MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn_data)
553556
{
@@ -637,6 +640,8 @@ MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn_data)
637640

638641
func_mysqlnd_conn_data__negotiate_client_api_capabilities negotiate_client_api_capabilities;
639642
func_mysqlnd_conn_data__get_client_api_capabilities get_client_api_capabilities;
643+
644+
func_mysqlnd_conn_data__get_scheme get_scheme;
640645
};
641646

642647

0 commit comments

Comments
 (0)