@@ -225,14 +225,18 @@ MYSQLND_METHOD(mysqlnd_conn, simple_command_handle_response)(MYSQLND * conn, enu
225
225
zend_bool silent , enum php_mysqlnd_server_command command ,
226
226
zend_bool ignore_upsert_status TSRMLS_DC )
227
227
{
228
- enum_func_status ret ;
228
+ enum_func_status ret = FAIL ;
229
229
230
230
DBG_ENTER ("mysqlnd_conn::simple_command_handle_response" );
231
231
DBG_INF_FMT ("silent=%d packet=%d command=%s" , silent , ok_packet , mysqlnd_command_to_text [command ]);
232
232
233
233
switch (ok_packet ) {
234
234
case PROT_OK_PACKET :{
235
235
MYSQLND_PACKET_OK * ok_response = conn -> protocol -> m .get_ok_packet (conn -> protocol , FALSE TSRMLS_CC );
236
+ if (!ok_response ) {
237
+ SET_OOM_ERROR (conn -> error_info );
238
+ break ;
239
+ }
236
240
if (FAIL == (ret = PACKET_READ (ok_response , conn ))) {
237
241
if (!silent ) {
238
242
DBG_ERR_FMT ("Error while reading %s's OK packet" , mysqlnd_command_to_text [command ]);
@@ -274,6 +278,10 @@ MYSQLND_METHOD(mysqlnd_conn, simple_command_handle_response)(MYSQLND * conn, enu
274
278
}
275
279
case PROT_EOF_PACKET :{
276
280
MYSQLND_PACKET_EOF * ok_response = conn -> protocol -> m .get_eof_packet (conn -> protocol , FALSE TSRMLS_CC );
281
+ if (!ok_response ) {
282
+ SET_OOM_ERROR (conn -> error_info );
283
+ break ;
284
+ }
277
285
if (FAIL == (ret = PACKET_READ (ok_response , conn ))) {
278
286
SET_CLIENT_ERROR (conn -> error_info , CR_MALFORMED_PACKET , UNKNOWN_SQLSTATE ,
279
287
"Malformed packet" );
@@ -300,7 +308,6 @@ MYSQLND_METHOD(mysqlnd_conn, simple_command_handle_response)(MYSQLND * conn, enu
300
308
break ;
301
309
}
302
310
default :
303
- ret = FAIL ;
304
311
SET_CLIENT_ERROR (conn -> error_info , CR_MALFORMED_PACKET , UNKNOWN_SQLSTATE , "Malformed packet" );
305
312
php_error_docref (NULL TSRMLS_CC , E_ERROR , "Wrong response packet %d passed to the function" , ok_packet );
306
313
break ;
@@ -344,6 +351,11 @@ MYSQLND_METHOD(mysqlnd_conn, simple_command)(MYSQLND * conn, enum php_mysqlnd_se
344
351
SET_EMPTY_ERROR (conn -> error_info );
345
352
346
353
cmd_packet = conn -> protocol -> m .get_command_packet (conn -> protocol , FALSE TSRMLS_CC );
354
+ if (!cmd_packet ) {
355
+ SET_OOM_ERROR (conn -> error_info );
356
+ DBG_RETURN (FAIL );
357
+ }
358
+
347
359
cmd_packet -> command = command ;
348
360
if (arg && arg_len ) {
349
361
cmd_packet -> argument = arg ;
@@ -526,6 +538,7 @@ MYSQLND_METHOD(mysqlnd_conn, connect)(MYSQLND * conn,
526
538
transport_len = spprintf (& transport , 0 , "tcp://%s:%d" , host , port );
527
539
}
528
540
if (!transport ) {
541
+ SET_OOM_ERROR (conn -> error_info );
529
542
goto err ; /* OOM */
530
543
}
531
544
DBG_INF_FMT ("transport=%s" , transport );
@@ -542,6 +555,7 @@ MYSQLND_METHOD(mysqlnd_conn, connect)(MYSQLND * conn,
542
555
auth_packet = conn -> protocol -> m .get_auth_packet (conn -> protocol , FALSE TSRMLS_CC );
543
556
ok_packet = conn -> protocol -> m .get_ok_packet (conn -> protocol , FALSE TSRMLS_CC );
544
557
if (!greet_packet || !auth_packet || !ok_packet ) {
558
+ SET_OOM_ERROR (conn -> error_info );
545
559
goto err ; /* OOM */
546
560
}
547
561
@@ -613,6 +627,7 @@ MYSQLND_METHOD(mysqlnd_conn, connect)(MYSQLND * conn,
613
627
614
628
conn -> scramble = auth_packet -> server_scramble_buf = mnd_pemalloc (SCRAMBLE_LENGTH , conn -> persistent );
615
629
if (!conn -> scramble ) {
630
+ SET_OOM_ERROR (conn -> error_info );
616
631
goto err ; /* OOM */
617
632
}
618
633
memcpy (auth_packet -> server_scramble_buf , greet_packet -> scramble_buf , SCRAMBLE_LENGTH );
@@ -682,31 +697,36 @@ MYSQLND_METHOD(mysqlnd_conn, connect)(MYSQLND * conn,
682
697
conn -> connect_or_select_db_len = db_len ;
683
698
684
699
if (!conn -> user || !conn -> passwd || !conn -> connect_or_select_db ) {
700
+ SET_OOM_ERROR (conn -> error_info );
685
701
goto err ; /* OOM */
686
702
}
687
703
688
704
if (!unix_socket ) {
689
705
conn -> host = mnd_pestrdup (host , conn -> persistent );
690
706
if (!conn -> host ) {
707
+ SET_OOM_ERROR (conn -> error_info );
691
708
goto err ; /* OOM */
692
709
}
693
710
conn -> host_len = strlen (conn -> host );
694
711
{
695
712
char * p ;
696
713
spprintf (& p , 0 , "%s via TCP/IP" , conn -> host );
697
714
if (!p ) {
715
+ SET_OOM_ERROR (conn -> error_info );
698
716
goto err ; /* OOM */
699
717
}
700
718
conn -> host_info = mnd_pestrdup (p , conn -> persistent );
701
719
efree (p ); /* allocated by spprintf */
702
720
if (!conn -> host_info ) {
721
+ SET_OOM_ERROR (conn -> error_info );
703
722
goto err ; /* OOM */
704
723
}
705
724
}
706
725
} else {
707
726
conn -> unix_socket = mnd_pestrdup (socket , conn -> persistent );
708
727
conn -> host_info = mnd_pestrdup ("Localhost via UNIX socket" , conn -> persistent );
709
728
if (!conn -> unix_socket || !conn -> host_info ) {
729
+ SET_OOM_ERROR (conn -> error_info );
710
730
goto err ; /* OOM */
711
731
}
712
732
conn -> unix_socket_len = strlen (conn -> unix_socket );
@@ -1333,6 +1353,11 @@ MYSQLND_METHOD(mysqlnd_conn, stat)(MYSQLND * conn, char **message, unsigned int
1333
1353
DBG_RETURN (FAIL );
1334
1354
}
1335
1355
stats_header = conn -> protocol -> m .get_stats_packet (conn -> protocol , FALSE TSRMLS_CC );
1356
+ if (!stats_header ) {
1357
+ SET_OOM_ERROR (conn -> error_info );
1358
+ DBG_RETURN (FAIL );
1359
+ }
1360
+
1336
1361
if (FAIL == (ret = PACKET_READ (stats_header , conn ))) {
1337
1362
DBG_RETURN (FAIL );
1338
1363
}
@@ -1829,7 +1854,7 @@ MYSQLND_METHOD(mysqlnd_conn, change_user)(MYSQLND * const conn,
1829
1854
buffer overflows.
1830
1855
*/
1831
1856
size_t user_len ;
1832
- enum_func_status ret ;
1857
+ enum_func_status ret = FAIL ;
1833
1858
MYSQLND_PACKET_CHG_USER_RESPONSE * chg_user_resp ;
1834
1859
char buffer [MYSQLND_MAX_ALLOWED_USER_LEN + 1 + SCRAMBLE_LENGTH + MYSQLND_MAX_ALLOWED_DB_LEN + 1 ];
1835
1860
char * p = buffer ;
@@ -1838,6 +1863,8 @@ MYSQLND_METHOD(mysqlnd_conn, change_user)(MYSQLND * const conn,
1838
1863
DBG_INF_FMT ("conn=%llu user=%s passwd=%s db=%s silent=%d" ,
1839
1864
conn -> thread_id , user ?user :"" , passwd ?"***" :"null" , db ?db :"" , (silent == TRUE)?1 :0 );
1840
1865
1866
+ SET_ERROR_AFF_ROWS (conn );
1867
+
1841
1868
if (!user ) {
1842
1869
user = "" ;
1843
1870
}
@@ -1878,6 +1905,10 @@ MYSQLND_METHOD(mysqlnd_conn, change_user)(MYSQLND * const conn,
1878
1905
}
1879
1906
1880
1907
chg_user_resp = conn -> protocol -> m .get_change_user_response_packet (conn -> protocol , FALSE TSRMLS_CC );
1908
+ if (!chg_user_resp ) {
1909
+ SET_OOM_ERROR (conn -> error_info );
1910
+ goto end ;
1911
+ }
1881
1912
ret = PACKET_READ (chg_user_resp , conn );
1882
1913
conn -> error_info = chg_user_resp -> error_info ;
1883
1914
@@ -1888,13 +1919,15 @@ MYSQLND_METHOD(mysqlnd_conn, change_user)(MYSQLND * const conn,
1888
1919
bug#25371 mysql_change_user() triggers "packets out of sync"
1889
1920
When it gets fixed, there should be one more check here
1890
1921
*/
1891
- if (mysqlnd_get_server_version (conn ) > 50113L &&
1892
- mysqlnd_get_server_version (conn ) < 50118L )
1893
- {
1922
+ if (mysqlnd_get_server_version (conn ) > 50113L && mysqlnd_get_server_version (conn ) < 50118L ) {
1894
1923
MYSQLND_PACKET_OK * redundant_error_packet = conn -> protocol -> m .get_ok_packet (conn -> protocol , FALSE TSRMLS_CC );
1895
- PACKET_READ (redundant_error_packet , conn );
1896
- PACKET_FREE (redundant_error_packet );
1897
- DBG_INF_FMT ("Server is %d, buggy, sends two ERR messages" , mysqlnd_get_server_version (conn ));
1924
+ if (redundant_error_packet ) {
1925
+ PACKET_READ (redundant_error_packet , conn );
1926
+ PACKET_FREE (redundant_error_packet );
1927
+ DBG_INF_FMT ("Server is %d, buggy, sends two ERR messages" , mysqlnd_get_server_version (conn ));
1928
+ } else {
1929
+ SET_OOM_ERROR (conn -> error_info );
1930
+ }
1898
1931
}
1899
1932
}
1900
1933
if (ret == PASS ) {
@@ -1919,10 +1952,9 @@ MYSQLND_METHOD(mysqlnd_conn, change_user)(MYSQLND * const conn,
1919
1952
DBG_ERR (mysqlnd_old_passwd );
1920
1953
SET_CLIENT_ERROR (conn -> error_info , CR_UNKNOWN_ERROR , UNKNOWN_SQLSTATE , mysqlnd_old_passwd );
1921
1954
}
1955
+ end :
1922
1956
PACKET_FREE (chg_user_resp );
1923
1957
1924
- SET_ERROR_AFF_ROWS (conn );
1925
-
1926
1958
/*
1927
1959
Here we should close all statements. Unbuffered queries should not be a
1928
1960
problem as we won't allow sending COM_CHANGE_USER.
0 commit comments