Skip to content

Commit 81f7547

Browse files
committed
Fix GH-19248: Use strerror_r instead of strerror in main
1 parent a7cdf0b commit 81f7547

File tree

5 files changed

+82
-27
lines changed

5 files changed

+82
-27
lines changed

main/network.c

Lines changed: 45 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1061,16 +1061,40 @@ PHPAPI int php_sockaddr_size(php_sockaddr_storage *addr)
10611061
PHPAPI char *php_socket_strerror(long err, char *buf, size_t bufsize)
10621062
{
10631063
#ifndef PHP_WIN32
1064-
char *errstr;
1065-
1066-
errstr = strerror(err);
1064+
# ifdef HAVE_STRERROR_R
1065+
if (buf == NULL) {
1066+
char ebuf[256];
1067+
# ifdef STRERROR_R_CHAR_P
1068+
char *errstr = strerror_r(err, ebuf, sizeof(ebuf));
1069+
buf = estrdup(errstr);
1070+
# else
1071+
errno_t res = strerror_r(err, ebuf, sizeof(ebuf));
1072+
if (res == 0) {
1073+
buf = estrdup(ebuf);
1074+
} else {
1075+
buf = estrdup("Unknown error");
1076+
}
1077+
# endif
1078+
} else {
1079+
# ifdef STRERROR_R_CHAR_P
1080+
buf = strerror_r(err, buf, bufsize);
1081+
# else
1082+
errno_t res = strerror_r(err, buf, bufsize);
1083+
if (res != 0) {
1084+
strncpy(buf, "Unknown error", bufsize);
1085+
buf[bufsize?(bufsize-1):0] = 0;
1086+
}
1087+
# endif
1088+
}
1089+
# else
1090+
char *errstr = strerror(err);
10671091
if (buf == NULL) {
10681092
buf = estrdup(errstr);
10691093
} else {
10701094
strncpy(buf, errstr, bufsize);
10711095
buf[bufsize?(bufsize-1):0] = 0;
10721096
}
1073-
return buf;
1097+
# endif
10741098
#else
10751099
char *sysbuf = php_win32_error_to_msg(err);
10761100
if (!sysbuf[0]) {
@@ -1085,19 +1109,31 @@ PHPAPI char *php_socket_strerror(long err, char *buf, size_t bufsize)
10851109
}
10861110

10871111
php_win32_error_msg_free(sysbuf);
1088-
1089-
return buf;
10901112
#endif
1113+
return buf;
10911114
}
10921115
/* }}} */
10931116

10941117
/* {{{ php_socket_error_str */
10951118
PHPAPI zend_string *php_socket_error_str(long err)
10961119
{
10971120
#ifndef PHP_WIN32
1098-
char *errstr;
1099-
1100-
errstr = strerror(err);
1121+
# ifdef HAVE_STRERROR_R
1122+
char ebuf[256];
1123+
# ifdef STRERROR_R_CHAR_P
1124+
char *errstr = strerror_r(err, ebuf, sizeof(ebuf));
1125+
# else
1126+
const char *errstr;
1127+
errno_t res = strerror_r(err, buf, bufsize);
1128+
if (res == 0) {
1129+
errstr = buf;
1130+
} else {
1131+
errstr = "Unknown error";
1132+
}
1133+
# endif
1134+
# else
1135+
char *errstr = strerror(err);
1136+
# endif
11011137
return zend_string_init(errstr, strlen(errstr), 0);
11021138
#else
11031139
zend_string *ret;

main/rfc1867.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1038,7 +1038,8 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler) /* {{{ */
10381038
if (wlen == (size_t)-1) {
10391039
/* write failed */
10401040
#if DEBUG_FILE_UPLOAD
1041-
sapi_module.sapi_error(E_NOTICE, "write() failed - %s", strerror(errno));
1041+
char errstr[256];
1042+
sapi_module.sapi_error(E_NOTICE, "write() failed - %s", php_socket_strerror(errno, errstr, sizeof(errstr)));
10421043
#endif
10431044
cancel_upload = PHP_UPLOAD_ERROR_F;
10441045
} else if (wlen < blen) {

main/streams/plain_wrapper.c

Lines changed: 31 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -368,7 +368,9 @@ static ssize_t php_stdiop_write(php_stream *stream, const char *buf, size_t coun
368368
return bytes_written;
369369
}
370370
if (!(stream->flags & PHP_STREAM_FLAG_SUPPRESS_ERRORS)) {
371-
php_error_docref(NULL, E_NOTICE, "Write of %zu bytes failed with errno=%d %s", count, errno, strerror(errno));
371+
char errstr[256];
372+
php_error_docref(NULL, E_NOTICE, "Write of %zu bytes failed with errno=%d %s",
373+
count, errno, php_socket_strerror(errno, errstr, sizeof(errstr)));
372374
}
373375
}
374376
} else {
@@ -444,7 +446,9 @@ static ssize_t php_stdiop_read(php_stream *stream, char *buf, size_t count)
444446
/* TODO: Should this be treated as a proper error or not? */
445447
} else {
446448
if (!(stream->flags & PHP_STREAM_FLAG_SUPPRESS_ERRORS)) {
447-
php_error_docref(NULL, E_NOTICE, "Read of %zu bytes failed with errno=%d %s", count, errno, strerror(errno));
449+
char errstr[256];
450+
php_error_docref(NULL, E_NOTICE, "Read of %zu bytes failed with errno=%d %s",
451+
count, errno, php_socket_strerror(errno, errstr, sizeof(errstr)));
448452
}
449453

450454
/* TODO: Remove this special-case? */
@@ -1278,7 +1282,9 @@ static int php_plain_files_unlink(php_stream_wrapper *wrapper, const char *url,
12781282
ret = VCWD_UNLINK(url);
12791283
if (ret == -1) {
12801284
if (options & REPORT_ERRORS) {
1281-
php_error_docref1(NULL, url, E_WARNING, "%s", strerror(errno));
1285+
char errstr[256];
1286+
php_error_docref1(NULL, url, E_WARNING, "%s",
1287+
php_socket_strerror(errno, errstr, sizeof(errstr)));
12821288
}
12831289
return 0;
12841290
}
@@ -1321,6 +1327,7 @@ static int php_plain_files_rename(php_stream_wrapper *wrapper, const char *url_f
13211327
}
13221328

13231329
ret = VCWD_RENAME(url_from, url_to);
1330+
char errstr[256];
13241331

13251332
if (ret == -1) {
13261333
#ifndef PHP_WIN32
@@ -1344,15 +1351,17 @@ static int php_plain_files_rename(php_stream_wrapper *wrapper, const char *url_f
13441351
* access to the file in the meantime.
13451352
*/
13461353
if (VCWD_CHOWN(url_to, sb.st_uid, sb.st_gid)) {
1347-
php_error_docref2(NULL, url_from, url_to, E_WARNING, "%s", strerror(errno));
1354+
php_error_docref2(NULL, url_from, url_to, E_WARNING, "%s",
1355+
php_socket_strerror(errno, errstr, sizeof(errstr)));
13481356
if (errno != EPERM) {
13491357
success = 0;
13501358
}
13511359
}
13521360

13531361
if (success) {
13541362
if (VCWD_CHMOD(url_to, sb.st_mode)) {
1355-
php_error_docref2(NULL, url_from, url_to, E_WARNING, "%s", strerror(errno));
1363+
php_error_docref2(NULL, url_from, url_to, E_WARNING, "%s",
1364+
php_socket_strerror(errno, errstr, sizeof(errstr)));
13561365
if (errno != EPERM) {
13571366
success = 0;
13581367
}
@@ -1363,10 +1372,12 @@ static int php_plain_files_rename(php_stream_wrapper *wrapper, const char *url_f
13631372
VCWD_UNLINK(url_from);
13641373
}
13651374
} else {
1366-
php_error_docref2(NULL, url_from, url_to, E_WARNING, "%s", strerror(errno));
1375+
php_error_docref2(NULL, url_from, url_to, E_WARNING, "%s",
1376+
php_socket_strerror(errno, errstr, sizeof(errstr)));
13671377
}
13681378
} else {
1369-
php_error_docref2(NULL, url_from, url_to, E_WARNING, "%s", strerror(errno));
1379+
php_error_docref2(NULL, url_from, url_to, E_WARNING, "%s",
1380+
php_socket_strerror(errno, errstr, sizeof(errstr)));
13701381
}
13711382
# if !defined(ZTS) && !defined(TSRM_WIN32)
13721383
umask(oldmask);
@@ -1379,7 +1390,8 @@ static int php_plain_files_rename(php_stream_wrapper *wrapper, const char *url_f
13791390
#ifdef PHP_WIN32
13801391
php_win32_docref2_from_error(GetLastError(), url_from, url_to);
13811392
#else
1382-
php_error_docref2(NULL, url_from, url_to, E_WARNING, "%s", strerror(errno));
1393+
php_error_docref2(NULL, url_from, url_to, E_WARNING, "%s",
1394+
php_socket_strerror(errno, errstr, sizeof(errstr)));
13831395
#endif
13841396
return 0;
13851397
}
@@ -1449,11 +1461,12 @@ static int php_plain_files_mkdir(php_stream_wrapper *wrapper, const char *dir, i
14491461
if (!p) {
14501462
p = buf;
14511463
}
1464+
char errstr[256];
14521465
while (true) {
14531466
int ret = VCWD_MKDIR(buf, (mode_t) mode);
14541467
if (ret < 0 && errno != EEXIST) {
14551468
if (options & REPORT_ERRORS) {
1456-
php_error_docref(NULL, E_WARNING, "%s", strerror(errno));
1469+
php_error_docref(NULL, E_WARNING, "%s", php_socket_strerror(errno, errstr, sizeof(errstr)));
14571470
}
14581471
return 0;
14591472
}
@@ -1473,7 +1486,7 @@ static int php_plain_files_mkdir(php_stream_wrapper *wrapper, const char *dir, i
14731486
/* issue a warning to client when the last directory was created failed */
14741487
if (ret < 0) {
14751488
if (options & REPORT_ERRORS) {
1476-
php_error_docref(NULL, E_WARNING, "%s", strerror(errno));
1489+
php_error_docref(NULL, E_WARNING, "%s", php_socket_strerror(errno, errstr, sizeof(errstr)));
14771490
}
14781491
return 0;
14791492
}
@@ -1492,15 +1505,16 @@ static int php_plain_files_rmdir(php_stream_wrapper *wrapper, const char *url, i
14921505
return 0;
14931506
}
14941507

1508+
char errstr[256];
14951509
#ifdef PHP_WIN32
14961510
if (!php_win32_check_trailing_space(url, strlen(url))) {
1497-
php_error_docref1(NULL, url, E_WARNING, "%s", strerror(ENOENT));
1511+
php_error_docref1(NULL, url, E_WARNING, "%s", php_socket_strerror(ENOENT, errstr, sizeof(errstr)));
14981512
return 0;
14991513
}
15001514
#endif
15011515

15021516
if (VCWD_RMDIR(url) < 0) {
1503-
php_error_docref1(NULL, url, E_WARNING, "%s", strerror(errno));
1517+
php_error_docref1(NULL, url, E_WARNING, "%s", php_socket_strerror(errno, errstr, sizeof(errstr)));
15041518
return 0;
15051519
}
15061520

@@ -1519,10 +1533,11 @@ static int php_plain_files_metadata(php_stream_wrapper *wrapper, const char *url
15191533
#endif
15201534
mode_t mode;
15211535
int ret = 0;
1536+
char errstr[256];
15221537

15231538
#ifdef PHP_WIN32
15241539
if (!php_win32_check_trailing_space(url, strlen(url))) {
1525-
php_error_docref1(NULL, url, E_WARNING, "%s", strerror(ENOENT));
1540+
php_error_docref1(NULL, url, E_WARNING, "%s", php_socket_strerror(ENOENT, errstr, sizeof(errstr)));
15261541
return 0;
15271542
}
15281543
#endif
@@ -1541,7 +1556,8 @@ static int php_plain_files_metadata(php_stream_wrapper *wrapper, const char *url
15411556
if (VCWD_ACCESS(url, F_OK) != 0) {
15421557
FILE *file = VCWD_FOPEN(url, "w");
15431558
if (file == NULL) {
1544-
php_error_docref1(NULL, url, E_WARNING, "Unable to create file %s because %s", url, strerror(errno));
1559+
php_error_docref1(NULL, url, E_WARNING, "Unable to create file %s because %s", url,
1560+
php_socket_strerror(errno, errstr, sizeof(errstr)));
15451561
return 0;
15461562
}
15471563
fclose(file);
@@ -1584,7 +1600,7 @@ static int php_plain_files_metadata(php_stream_wrapper *wrapper, const char *url
15841600
return 0;
15851601
}
15861602
if (ret == -1) {
1587-
php_error_docref1(NULL, url, E_WARNING, "Operation failed: %s", strerror(errno));
1603+
php_error_docref1(NULL, url, E_WARNING, "Operation failed: %s", php_socket_strerror(errno, errstr, sizeof(errstr)));
15881604
return 0;
15891605
}
15901606
php_clear_stat_cache(0, NULL, 0);

main/streams/streams.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,8 @@ static void php_stream_display_wrapper_errors(php_stream_wrapper *wrapper, const
203203
free_msg = 1;
204204
} else {
205205
if (wrapper == &php_plain_files_wrapper) {
206-
msg = strerror(errno); /* TODO: not ts on linux */
206+
char errstr[256];
207+
msg = php_socket_strerror(errno, errstr, sizeof(errstr));
207208
} else {
208209
msg = "operation failed";
209210
}

main/streams/xp_socket.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -674,9 +674,10 @@ static inline int php_tcp_sockop_bind(php_stream *stream, php_netstream_data_t *
674674

675675
if (sock->socket == SOCK_ERR) {
676676
if (xparam->want_errortext) {
677+
char errstr[256];
677678
xparam->outputs.error_text = strpprintf(0, "Failed to create unix%s socket %s",
678679
stream->ops == &php_stream_unix_socket_ops ? "" : "datagram",
679-
strerror(errno));
680+
php_socket_strerror(errno, errstr, sizeof(errstr)));
680681
}
681682
return -1;
682683
}

0 commit comments

Comments
 (0)