Skip to content

Commit 7b46ec6

Browse files
committed
Merge branch 'PHP-8.5'
2 parents 75b87b1 + 879d5e9 commit 7b46ec6

File tree

6 files changed

+110
-27
lines changed

6 files changed

+110
-27
lines changed

main/network.c

Lines changed: 67 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1036,6 +1036,28 @@ PHPAPI socklen_t php_sockaddr_size(php_sockaddr_storage *addr)
10361036
}
10371037
/* }}} */
10381038

1039+
#ifdef PHP_WIN32
1040+
char *php_socket_strerror_s(long err, char *buf, size_t bufsize)
1041+
{
1042+
if (buf == NULL) {
1043+
char ebuf[1024];
1044+
errno_t res = strerror_s(ebuf, sizeof(ebuf), err);
1045+
if (res == 0) {
1046+
buf = estrdup(ebuf);
1047+
} else {
1048+
buf = estrdup("Unknown error");
1049+
}
1050+
} else {
1051+
errno_t res = strerror_s(buf, bufsize, err);
1052+
if (res != 0) {
1053+
strncpy(buf, "Unknown error", bufsize);
1054+
buf[bufsize?(bufsize-1):0] = 0;
1055+
}
1056+
}
1057+
return buf;
1058+
}
1059+
#endif
1060+
10391061
/* Given a socket error code, if buf == NULL:
10401062
* emallocs storage for the error message and returns
10411063
* else
@@ -1045,16 +1067,40 @@ PHPAPI socklen_t php_sockaddr_size(php_sockaddr_storage *addr)
10451067
PHPAPI char *php_socket_strerror(long err, char *buf, size_t bufsize)
10461068
{
10471069
#ifndef PHP_WIN32
1048-
char *errstr;
1049-
1050-
errstr = strerror(err);
1070+
# ifdef HAVE_STRERROR_R
1071+
if (buf == NULL) {
1072+
char ebuf[1024];
1073+
# ifdef STRERROR_R_CHAR_P
1074+
char *errstr = strerror_r(err, ebuf, sizeof(ebuf));
1075+
buf = estrdup(errstr);
1076+
# else
1077+
errno_t res = strerror_r(err, ebuf, sizeof(ebuf));
1078+
if (res == 0) {
1079+
buf = estrdup(ebuf);
1080+
} else {
1081+
buf = estrdup("Unknown error");
1082+
}
1083+
# endif
1084+
} else {
1085+
# ifdef STRERROR_R_CHAR_P
1086+
buf = strerror_r(err, buf, bufsize);
1087+
# else
1088+
errno_t res = strerror_r(err, buf, bufsize);
1089+
if (res != 0) {
1090+
strncpy(buf, "Unknown error", bufsize);
1091+
buf[bufsize?(bufsize-1):0] = 0;
1092+
}
1093+
# endif
1094+
}
1095+
# else
1096+
char *errstr = strerror(err);
10511097
if (buf == NULL) {
10521098
buf = estrdup(errstr);
10531099
} else {
10541100
strncpy(buf, errstr, bufsize);
10551101
buf[bufsize?(bufsize-1):0] = 0;
10561102
}
1057-
return buf;
1103+
# endif
10581104
#else
10591105
char *sysbuf = php_win32_error_to_msg(err);
10601106
if (!sysbuf[0]) {
@@ -1069,19 +1115,31 @@ PHPAPI char *php_socket_strerror(long err, char *buf, size_t bufsize)
10691115
}
10701116

10711117
php_win32_error_msg_free(sysbuf);
1072-
1073-
return buf;
10741118
#endif
1119+
return buf;
10751120
}
10761121
/* }}} */
10771122

10781123
/* {{{ php_socket_error_str */
10791124
PHPAPI zend_string *php_socket_error_str(long err)
10801125
{
10811126
#ifndef PHP_WIN32
1082-
char *errstr;
1083-
1084-
errstr = strerror(err);
1127+
# ifdef HAVE_STRERROR_R
1128+
char ebuf[1024];
1129+
# ifdef STRERROR_R_CHAR_P
1130+
char *errstr = strerror_r(err, ebuf, sizeof(ebuf));
1131+
# else
1132+
const char *errstr;
1133+
errno_t res = strerror_r(err, ebuf, sizeof(ebuf));
1134+
if (res == 0) {
1135+
errstr = ebuf;
1136+
} else {
1137+
errstr = "Unknown error";
1138+
}
1139+
# endif
1140+
# else
1141+
char *errstr = strerror(err);
1142+
# endif
10851143
return zend_string_init(errstr, strlen(errstr), 0);
10861144
#else
10871145
zend_string *ret;

main/php_network.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,11 @@
6464
* unless buf is not NULL.
6565
* Also works sensibly for win32 */
6666
BEGIN_EXTERN_C()
67+
#ifdef PHP_WIN32
68+
char *php_socket_strerror_s(long err, char *buf, size_t bufsize);
69+
#else
70+
#define php_socket_strerror_s php_socket_strerror
71+
#endif
6772
PHPAPI char *php_socket_strerror(long err, char *buf, size_t bufsize);
6873
PHPAPI zend_string *php_socket_error_str(long err);
6974
END_EXTERN_C()

main/rfc1867.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1048,7 +1048,8 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler)
10481048
if (wlen == (size_t)-1) {
10491049
/* write failed */
10501050
#if DEBUG_FILE_UPLOAD
1051-
sapi_module.sapi_error(E_NOTICE, "write() failed - %s", strerror(errno));
1051+
char errstr[256];
1052+
sapi_module.sapi_error(E_NOTICE, "write() failed - %s", php_socket_strerror_s(errno, errstr, sizeof(errstr)));
10521053
#endif
10531054
cancel_upload = PHP_UPLOAD_ERROR_F;
10541055
} else if (wlen < blen) {

main/streams/plain_wrapper.c

Lines changed: 32 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_s(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_s(errno, errstr, sizeof(errstr)));
448452
}
449453

450454
/* TODO: Remove this special-case? */
@@ -1281,7 +1285,9 @@ static int php_plain_files_unlink(php_stream_wrapper *wrapper, const char *url,
12811285
ret = VCWD_UNLINK(url);
12821286
if (ret == -1) {
12831287
if (options & REPORT_ERRORS) {
1284-
php_error_docref1(NULL, url, E_WARNING, "%s", strerror(errno));
1288+
char errstr[256];
1289+
php_error_docref1(NULL, url, E_WARNING, "%s",
1290+
php_socket_strerror_s(errno, errstr, sizeof(errstr)));
12851291
}
12861292
return 0;
12871293
}
@@ -1327,6 +1333,7 @@ static int php_plain_files_rename(php_stream_wrapper *wrapper, const char *url_f
13271333

13281334
if (ret == -1) {
13291335
#ifndef PHP_WIN32
1336+
char errstr[256];
13301337
# ifdef EXDEV
13311338
if (errno == EXDEV) {
13321339
zend_stat_t sb;
@@ -1347,15 +1354,17 @@ static int php_plain_files_rename(php_stream_wrapper *wrapper, const char *url_f
13471354
* access to the file in the meantime.
13481355
*/
13491356
if (VCWD_CHOWN(url_to, sb.st_uid, sb.st_gid)) {
1350-
php_error_docref2(NULL, url_from, url_to, E_WARNING, "%s", strerror(errno));
1357+
php_error_docref2(NULL, url_from, url_to, E_WARNING, "%s",
1358+
php_socket_strerror_s(errno, errstr, sizeof(errstr)));
13511359
if (errno != EPERM) {
13521360
success = 0;
13531361
}
13541362
}
13551363

13561364
if (success) {
13571365
if (VCWD_CHMOD(url_to, sb.st_mode)) {
1358-
php_error_docref2(NULL, url_from, url_to, E_WARNING, "%s", strerror(errno));
1366+
php_error_docref2(NULL, url_from, url_to, E_WARNING, "%s",
1367+
php_socket_strerror_s(errno, errstr, sizeof(errstr)));
13591368
if (errno != EPERM) {
13601369
success = 0;
13611370
}
@@ -1366,10 +1375,12 @@ static int php_plain_files_rename(php_stream_wrapper *wrapper, const char *url_f
13661375
VCWD_UNLINK(url_from);
13671376
}
13681377
} else {
1369-
php_error_docref2(NULL, url_from, url_to, E_WARNING, "%s", strerror(errno));
1378+
php_error_docref2(NULL, url_from, url_to, E_WARNING, "%s",
1379+
php_socket_strerror_s(errno, errstr, sizeof(errstr)));
13701380
}
13711381
} else {
1372-
php_error_docref2(NULL, url_from, url_to, E_WARNING, "%s", strerror(errno));
1382+
php_error_docref2(NULL, url_from, url_to, E_WARNING, "%s",
1383+
php_socket_strerror_s(errno, errstr, sizeof(errstr)));
13731384
}
13741385
# if !defined(ZTS) && !defined(TSRM_WIN32)
13751386
umask(oldmask);
@@ -1382,7 +1393,8 @@ static int php_plain_files_rename(php_stream_wrapper *wrapper, const char *url_f
13821393
#ifdef PHP_WIN32
13831394
php_win32_docref2_from_error(GetLastError(), url_from, url_to);
13841395
#else
1385-
php_error_docref2(NULL, url_from, url_to, E_WARNING, "%s", strerror(errno));
1396+
php_error_docref2(NULL, url_from, url_to, E_WARNING, "%s",
1397+
php_socket_strerror_s(errno, errstr, sizeof(errstr)));
13861398
#endif
13871399
return 0;
13881400
}
@@ -1462,11 +1474,12 @@ static int php_plain_files_mkdir(php_stream_wrapper *wrapper, const char *dir, i
14621474
if (!p) {
14631475
p = buf;
14641476
}
1477+
char errstr[256];
14651478
while (true) {
14661479
int ret = VCWD_MKDIR(buf, (mode_t) mode);
14671480
if (ret < 0 && errno != EEXIST) {
14681481
if (options & REPORT_ERRORS) {
1469-
php_error_docref(NULL, E_WARNING, "%s", strerror(errno));
1482+
php_error_docref(NULL, E_WARNING, "%s", php_socket_strerror_s(errno, errstr, sizeof(errstr)));
14701483
}
14711484
return 0;
14721485
}
@@ -1486,7 +1499,7 @@ static int php_plain_files_mkdir(php_stream_wrapper *wrapper, const char *dir, i
14861499
/* issue a warning to client when the last directory was created failed */
14871500
if (ret < 0) {
14881501
if (options & REPORT_ERRORS) {
1489-
php_error_docref(NULL, E_WARNING, "%s", strerror(errno));
1502+
php_error_docref(NULL, E_WARNING, "%s", php_socket_strerror_s(errno, errstr, sizeof(errstr)));
14901503
}
14911504
return 0;
14921505
}
@@ -1505,15 +1518,16 @@ static int php_plain_files_rmdir(php_stream_wrapper *wrapper, const char *url, i
15051518
return 0;
15061519
}
15071520

1521+
char errstr[256];
15081522
#ifdef PHP_WIN32
15091523
if (!php_win32_check_trailing_space(url, strlen(url))) {
1510-
php_error_docref1(NULL, url, E_WARNING, "%s", strerror(ENOENT));
1524+
php_error_docref1(NULL, url, E_WARNING, "%s", php_socket_strerror_s(ENOENT, errstr, sizeof(errstr)));
15111525
return 0;
15121526
}
15131527
#endif
15141528

15151529
if (VCWD_RMDIR(url) < 0) {
1516-
php_error_docref1(NULL, url, E_WARNING, "%s", strerror(errno));
1530+
php_error_docref1(NULL, url, E_WARNING, "%s", php_socket_strerror_s(errno, errstr, sizeof(errstr)));
15171531
return 0;
15181532
}
15191533

@@ -1532,10 +1546,11 @@ static int php_plain_files_metadata(php_stream_wrapper *wrapper, const char *url
15321546
#endif
15331547
mode_t mode;
15341548
int ret = 0;
1549+
char errstr[256];
15351550

15361551
#ifdef PHP_WIN32
15371552
if (!php_win32_check_trailing_space(url, strlen(url))) {
1538-
php_error_docref1(NULL, url, E_WARNING, "%s", strerror(ENOENT));
1553+
php_error_docref1(NULL, url, E_WARNING, "%s", php_socket_strerror_s(ENOENT, errstr, sizeof(errstr)));
15391554
return 0;
15401555
}
15411556
#endif
@@ -1554,7 +1569,8 @@ static int php_plain_files_metadata(php_stream_wrapper *wrapper, const char *url
15541569
if (VCWD_ACCESS(url, F_OK) != 0) {
15551570
FILE *file = VCWD_FOPEN(url, "w");
15561571
if (file == NULL) {
1557-
php_error_docref1(NULL, url, E_WARNING, "Unable to create file %s because %s", url, strerror(errno));
1572+
php_error_docref1(NULL, url, E_WARNING, "Unable to create file %s because %s", url,
1573+
php_socket_strerror_s(errno, errstr, sizeof(errstr)));
15581574
return 0;
15591575
}
15601576
fclose(file);
@@ -1597,7 +1613,8 @@ static int php_plain_files_metadata(php_stream_wrapper *wrapper, const char *url
15971613
return 0;
15981614
}
15991615
if (ret == -1) {
1600-
php_error_docref1(NULL, url, E_WARNING, "Operation failed: %s", strerror(errno));
1616+
php_error_docref1(NULL, url, E_WARNING, "Operation failed: %s",
1617+
php_socket_strerror_s(errno, errstr, sizeof(errstr)));
16011618
return 0;
16021619
}
16031620
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
@@ -204,7 +204,8 @@ static void php_stream_display_wrapper_errors(php_stream_wrapper *wrapper, const
204204
free_msg = 1;
205205
} else {
206206
if (wrapper == &php_plain_files_wrapper) {
207-
msg = strerror(errno); /* TODO: not ts on linux */
207+
char errstr[256];
208+
msg = php_socket_strerror_s(errno, errstr, sizeof(errstr));
208209
} else {
209210
msg = "operation failed";
210211
}

main/streams/xp_socket.c

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

679679
if (sock->socket == SOCK_ERR) {
680680
if (xparam->want_errortext) {
681+
char errstr[256];
681682
xparam->outputs.error_text = strpprintf(0, "Failed to create unix%s socket %s",
682683
stream->ops == &php_stream_unix_socket_ops ? "" : "datagram",
683-
strerror(errno));
684+
php_socket_strerror_s(errno, errstr, sizeof(errstr)));
684685
}
685686
return -1;
686687
}

0 commit comments

Comments
 (0)