@@ -61,6 +61,7 @@ PHPAPI const char * const mysqlnd_old_passwd = "mysqlnd cannot connect to MySQL
61
61
62
62
PHPAPI const char * const mysqlnd_server_gone = "MySQL server has gone away" ;
63
63
PHPAPI const char * const mysqlnd_out_of_sync = "Commands out of sync; you can't run this command now" ;
64
+ PHPAPI const char * const mysqlnd_out_of_memory = "Out of memory" ;
64
65
65
66
PHPAPI MYSQLND_STATS * mysqlnd_global_stats = NULL ;
66
67
static zend_bool mysqlnd_library_initted = FALSE;
@@ -524,16 +525,25 @@ MYSQLND_METHOD(mysqlnd_conn, connect)(MYSQLND * conn,
524
525
525
526
transport_len = spprintf (& transport , 0 , "tcp://%s:%d" , host , port );
526
527
}
528
+ if (!transport ) {
529
+ goto err ; /* OOM */
530
+ }
527
531
DBG_INF_FMT ("transport=%s" , transport );
528
532
conn -> scheme = mnd_pestrndup (transport , transport_len , conn -> persistent );
529
533
conn -> scheme_len = transport_len ;
530
534
efree (transport ); /* allocated by spprintf */
531
535
transport = NULL ;
536
+ if (!conn -> scheme ) {
537
+ goto err ; /* OOM */
538
+ }
532
539
}
533
540
534
541
greet_packet = conn -> protocol -> m .get_greet_packet (conn -> protocol , FALSE TSRMLS_CC );
535
542
auth_packet = conn -> protocol -> m .get_auth_packet (conn -> protocol , FALSE TSRMLS_CC );
536
543
ok_packet = conn -> protocol -> m .get_ok_packet (conn -> protocol , FALSE TSRMLS_CC );
544
+ if (!greet_packet || !auth_packet || !ok_packet ) {
545
+ goto err ; /* OOM */
546
+ }
537
547
538
548
if (FAIL == conn -> net -> m .connect (conn -> net , conn -> scheme , conn -> scheme_len , conn -> persistent , & errstr , & errcode TSRMLS_CC )) {
539
549
goto err ;
@@ -602,6 +612,9 @@ MYSQLND_METHOD(mysqlnd_conn, connect)(MYSQLND * conn,
602
612
auth_packet -> client_flags = mysql_flags ;
603
613
604
614
conn -> scramble = auth_packet -> server_scramble_buf = mnd_pemalloc (SCRAMBLE_LENGTH , conn -> persistent );
615
+ if (!conn -> scramble ) {
616
+ goto err ; /* OOM */
617
+ }
605
618
memcpy (auth_packet -> server_scramble_buf , greet_packet -> scramble_buf , SCRAMBLE_LENGTH );
606
619
607
620
if (!PACKET_WRITE (auth_packet , conn )) {
@@ -668,20 +681,35 @@ MYSQLND_METHOD(mysqlnd_conn, connect)(MYSQLND * conn,
668
681
conn -> connect_or_select_db = mnd_pestrndup (db , db_len , conn -> persistent );
669
682
conn -> connect_or_select_db_len = db_len ;
670
683
671
- if (!unix_socket ) {
684
+ if (!conn -> user || !conn -> passwd || !conn -> connect_or_select_db ) {
685
+ goto err ; /* OOM */
686
+ }
672
687
688
+ if (!unix_socket ) {
673
689
conn -> host = mnd_pestrdup (host , conn -> persistent );
690
+ if (!conn -> host ) {
691
+ goto err ; /* OOM */
692
+ }
674
693
conn -> host_len = strlen (conn -> host );
675
694
{
676
695
char * p ;
677
696
spprintf (& p , 0 , "%s via TCP/IP" , conn -> host );
697
+ if (!p ) {
698
+ goto err ; /* OOM */
699
+ }
678
700
conn -> host_info = mnd_pestrdup (p , conn -> persistent );
679
701
efree (p ); /* allocated by spprintf */
702
+ if (!conn -> host_info ) {
703
+ goto err ; /* OOM */
704
+ }
680
705
}
681
706
} else {
682
707
conn -> unix_socket = mnd_pestrdup (socket , conn -> persistent );
683
- conn -> unix_socket_len = strlen (conn -> unix_socket );
684
708
conn -> host_info = mnd_pestrdup ("Localhost via UNIX socket" , conn -> persistent );
709
+ if (!conn -> unix_socket || !conn -> host_info ) {
710
+ goto err ; /* OOM */
711
+ }
712
+ conn -> unix_socket_len = strlen (conn -> unix_socket );
685
713
}
686
714
conn -> client_flag = auth_packet -> client_flags ;
687
715
conn -> max_packet_size = auth_packet -> max_packet_size ;
@@ -720,14 +748,16 @@ MYSQLND_METHOD(mysqlnd_conn, connect)(MYSQLND * conn,
720
748
unsigned int current_command = 0 ;
721
749
for (; current_command < conn -> options .num_commands ; ++ current_command ) {
722
750
const char * const command = conn -> options .init_commands [current_command ];
723
- MYSQLND_INC_CONN_STATISTIC (conn -> stats , STAT_INIT_COMMAND_EXECUTED_COUNT );
724
- if (PASS != conn -> m -> query (conn , command , strlen (command ) TSRMLS_CC )) {
725
- MYSQLND_INC_CONN_STATISTIC (conn -> stats , STAT_INIT_COMMAND_FAILED_COUNT );
726
- goto err ;
727
- }
728
- if (conn -> last_query_type == QUERY_SELECT ) {
729
- MYSQLND_RES * result = conn -> m -> use_result (conn TSRMLS_CC );
730
- result -> m .free_result (result , TRUE TSRMLS_CC );
751
+ if (command ) {
752
+ MYSQLND_INC_CONN_STATISTIC (conn -> stats , STAT_INIT_COMMAND_EXECUTED_COUNT );
753
+ if (PASS != conn -> m -> query (conn , command , strlen (command ) TSRMLS_CC )) {
754
+ MYSQLND_INC_CONN_STATISTIC (conn -> stats , STAT_INIT_COMMAND_FAILED_COUNT );
755
+ goto err ;
756
+ }
757
+ if (conn -> last_query_type == QUERY_SELECT ) {
758
+ MYSQLND_RES * result = conn -> m -> use_result (conn TSRMLS_CC );
759
+ result -> m .free_result (result , TRUE TSRMLS_CC );
760
+ }
731
761
}
732
762
}
733
763
}
@@ -782,6 +812,7 @@ PHPAPI MYSQLND * mysqlnd_connect(MYSQLND * conn,
782
812
if (!conn ) {
783
813
self_alloced = TRUE;
784
814
if (!(conn = mysqlnd_init (FALSE))) {
815
+ /* OOM */
785
816
DBG_RETURN (NULL );
786
817
}
787
818
}
@@ -1110,7 +1141,8 @@ MYSQLND_METHOD(mysqlnd_conn, list_fields)(MYSQLND * conn, const char *table, con
1110
1141
result -> m .fetch_row = result -> m .fetch_row_normal_unbuffered ;
1111
1142
result -> unbuf = mnd_ecalloc (1 , sizeof (MYSQLND_RES_UNBUFFERED ));
1112
1143
if (!result -> unbuf ) {
1113
- DBG_ERR ("OOM" );
1144
+ /* OOM */
1145
+ SET_OOM_ERROR (conn -> error_info );
1114
1146
result -> m .free_result (result , TRUE TSRMLS_CC );
1115
1147
DBG_RETURN (NULL );
1116
1148
}
@@ -1252,6 +1284,11 @@ MYSQLND_METHOD(mysqlnd_conn, select_db)(MYSQLND * const conn, const char * const
1252
1284
}
1253
1285
conn -> connect_or_select_db = mnd_pestrndup (db , db_len , conn -> persistent );
1254
1286
conn -> connect_or_select_db_len = db_len ;
1287
+ if (!conn -> connect_or_select_db ) {
1288
+ /* OOM */
1289
+ SET_OOM_ERROR (conn -> error_info );
1290
+ ret = FAIL ;
1291
+ }
1255
1292
}
1256
1293
DBG_RETURN (ret );
1257
1294
}
@@ -1860,10 +1897,16 @@ MYSQLND_METHOD(mysqlnd_conn, change_user)(MYSQLND * const conn,
1860
1897
}
1861
1898
}
1862
1899
if (ret == PASS ) {
1863
- mnd_pefree (conn -> user , conn -> persistent );
1900
+ if (conn -> user ) {
1901
+ mnd_pefree (conn -> user , conn -> persistent );
1902
+ }
1864
1903
conn -> user = mnd_pestrndup (user , user_len , conn -> persistent );
1865
- mnd_pefree (conn -> passwd , conn -> persistent );
1904
+
1905
+ if (conn -> passwd ) {
1906
+ mnd_pefree (conn -> passwd , conn -> persistent );
1907
+ }
1866
1908
conn -> passwd = mnd_pestrdup (passwd , conn -> persistent );
1909
+
1867
1910
if (conn -> last_message ) {
1868
1911
mnd_pefree (conn -> last_message , conn -> persistent );
1869
1912
conn -> last_message = NULL ;
@@ -1896,6 +1939,7 @@ MYSQLND_METHOD(mysqlnd_conn, set_client_option)(MYSQLND * const conn,
1896
1939
const char * const value
1897
1940
TSRMLS_DC )
1898
1941
{
1942
+ enum_func_status ret = PASS ;
1899
1943
DBG_ENTER ("mysqlnd_conn::set_client_option" );
1900
1944
DBG_INF_FMT ("conn=%llu option=%d" , conn -> thread_id , option );
1901
1945
switch (option ) {
@@ -1915,7 +1959,7 @@ MYSQLND_METHOD(mysqlnd_conn, set_client_option)(MYSQLND * const conn,
1915
1959
case MYSQL_OPT_CONNECT_TIMEOUT :
1916
1960
case MYSQLND_OPT_NET_CMD_BUFFER_SIZE :
1917
1961
case MYSQLND_OPT_NET_READ_BUFFER_SIZE :
1918
- conn -> net -> m .set_client_option (conn -> net , option , value TSRMLS_CC );
1962
+ ret = conn -> net -> m .set_client_option (conn -> net , option , value TSRMLS_CC );
1919
1963
break ;
1920
1964
#if PHP_MAJOR_VERSION >= 6
1921
1965
case MYSQLND_OPT_NUMERIC_AND_DATETIME_AS_UNICODE :
@@ -1943,11 +1987,11 @@ MYSQLND_METHOD(mysqlnd_conn, set_client_option)(MYSQLND * const conn,
1943
1987
conn -> options .init_commands = mnd_perealloc (conn -> options .init_commands , sizeof (char * ) * (conn -> options .num_commands + 1 ),
1944
1988
conn -> persistent );
1945
1989
if (!conn -> options .init_commands ) {
1946
- DBG_RETURN ( FAIL );
1990
+ goto oom ;
1947
1991
}
1948
1992
conn -> options .init_commands [conn -> options .num_commands ] = mnd_pestrdup (value , conn -> persistent );
1949
1993
if (!conn -> options .init_commands [conn -> options .num_commands ]) {
1950
- DBG_RETURN ( FAIL ) ;
1994
+ goto oom ;
1951
1995
}
1952
1996
++ conn -> options .num_commands ;
1953
1997
break ;
@@ -1966,6 +2010,9 @@ MYSQLND_METHOD(mysqlnd_conn, set_client_option)(MYSQLND * const conn,
1966
2010
conn -> options .charset_name = NULL ;
1967
2011
}
1968
2012
conn -> options .charset_name = mnd_pestrdup (value , conn -> persistent );
2013
+ if (!conn -> options .charset_name ) {
2014
+ goto oom ;
2015
+ }
1969
2016
DBG_INF_FMT ("charset=%s" , conn -> options .charset_name );
1970
2017
break ;
1971
2018
#ifdef WHEN_SUPPORTED_BY_MYSQLI
@@ -1990,9 +2037,12 @@ MYSQLND_METHOD(mysqlnd_conn, set_client_option)(MYSQLND * const conn,
1990
2037
/* not sure, todo ? */
1991
2038
#endif
1992
2039
default :
1993
- DBG_RETURN ( FAIL ) ;
2040
+ ret = FAIL ;
1994
2041
}
1995
- DBG_RETURN (PASS );
2042
+ DBG_RETURN (ret );
2043
+ oom :
2044
+ SET_OOM_ERROR (conn -> error_info );
2045
+ DBG_RETURN (FAIL );
1996
2046
}
1997
2047
/* }}} */
1998
2048
@@ -2176,6 +2226,9 @@ PHPAPI MYSQLND * _mysqlnd_init(zend_bool persistent TSRMLS_DC)
2176
2226
2177
2227
DBG_ENTER ("mysqlnd_init" );
2178
2228
DBG_INF_FMT ("persistent=%d" , persistent );
2229
+ if (!ret ) {
2230
+ DBG_RETURN (NULL );
2231
+ }
2179
2232
2180
2233
ret -> persistent = persistent ;
2181
2234
ret -> m = mysqlnd_conn_methods ;
0 commit comments