Skip to content

Commit b0dc325

Browse files
committed
Merge branch 'PHP-7.4'
* PHP-7.4: Handle SO_ options only at SOL_SOCKET level Allow different error message for errno 58
2 parents 2068f01 + f1bf058 commit b0dc325

File tree

2 files changed

+42
-41
lines changed

2 files changed

+42
-41
lines changed

ext/sockets/sockets.c

Lines changed: 41 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1727,61 +1727,62 @@ PHP_FUNCTION(socket_get_option)
17271727
}
17281728
#endif
17291729

1730-
/* sol_socket options and general case */
1731-
switch(optname) {
1732-
case SO_LINGER:
1733-
optlen = sizeof(linger_val);
1730+
if (level == SOL_SOCKET) {
1731+
switch (optname) {
1732+
case SO_LINGER:
1733+
optlen = sizeof(linger_val);
17341734

1735-
if (getsockopt(php_sock->bsd_socket, level, optname, (char*)&linger_val, &optlen) != 0) {
1736-
PHP_SOCKET_ERROR(php_sock, "Unable to retrieve socket option", errno);
1737-
RETURN_FALSE;
1738-
}
1735+
if (getsockopt(php_sock->bsd_socket, level, optname, (char*)&linger_val, &optlen) != 0) {
1736+
PHP_SOCKET_ERROR(php_sock, "Unable to retrieve socket option", errno);
1737+
RETURN_FALSE;
1738+
}
17391739

1740-
array_init(return_value);
1741-
add_assoc_long(return_value, "l_onoff", linger_val.l_onoff);
1742-
add_assoc_long(return_value, "l_linger", linger_val.l_linger);
1743-
break;
1740+
array_init(return_value);
1741+
add_assoc_long(return_value, "l_onoff", linger_val.l_onoff);
1742+
add_assoc_long(return_value, "l_linger", linger_val.l_linger);
1743+
return;
17441744

1745-
case SO_RCVTIMEO:
1746-
case SO_SNDTIMEO:
1745+
case SO_RCVTIMEO:
1746+
case SO_SNDTIMEO:
17471747
#ifndef PHP_WIN32
1748-
optlen = sizeof(tv);
1748+
optlen = sizeof(tv);
17491749

1750-
if (getsockopt(php_sock->bsd_socket, level, optname, (char*)&tv, &optlen) != 0) {
1751-
PHP_SOCKET_ERROR(php_sock, "Unable to retrieve socket option", errno);
1752-
RETURN_FALSE;
1753-
}
1750+
if (getsockopt(php_sock->bsd_socket, level, optname, (char*)&tv, &optlen) != 0) {
1751+
PHP_SOCKET_ERROR(php_sock, "Unable to retrieve socket option", errno);
1752+
RETURN_FALSE;
1753+
}
17541754
#else
1755-
optlen = sizeof(int);
1755+
optlen = sizeof(int);
17561756

1757-
if (getsockopt(php_sock->bsd_socket, level, optname, (char*)&timeout, &optlen) != 0) {
1758-
PHP_SOCKET_ERROR(php_sock, "Unable to retrieve socket option", errno);
1759-
RETURN_FALSE;
1760-
}
1757+
if (getsockopt(php_sock->bsd_socket, level, optname, (char*)&timeout, &optlen) != 0) {
1758+
PHP_SOCKET_ERROR(php_sock, "Unable to retrieve socket option", errno);
1759+
RETURN_FALSE;
1760+
}
17611761

1762-
tv.tv_sec = timeout ? timeout / 1000 : 0;
1763-
tv.tv_usec = timeout ? (timeout * 1000) % 1000000 : 0;
1762+
tv.tv_sec = timeout ? timeout / 1000 : 0;
1763+
tv.tv_usec = timeout ? (timeout * 1000) % 1000000 : 0;
17641764
#endif
17651765

1766-
array_init(return_value);
1766+
array_init(return_value);
17671767

1768-
add_assoc_long(return_value, "sec", tv.tv_sec);
1769-
add_assoc_long(return_value, "usec", tv.tv_usec);
1770-
break;
1768+
add_assoc_long(return_value, "sec", tv.tv_sec);
1769+
add_assoc_long(return_value, "usec", tv.tv_usec);
1770+
return;
1771+
}
1772+
}
17711773

1772-
default:
1773-
optlen = sizeof(other_val);
1774+
optlen = sizeof(other_val);
17741775

1775-
if (getsockopt(php_sock->bsd_socket, level, optname, (char*)&other_val, &optlen) != 0) {
1776-
PHP_SOCKET_ERROR(php_sock, "Unable to retrieve socket option", errno);
1777-
RETURN_FALSE;
1778-
}
1779-
if (optlen == 1)
1780-
other_val = *((unsigned char *)&other_val);
1776+
if (getsockopt(php_sock->bsd_socket, level, optname, (char*)&other_val, &optlen) != 0) {
1777+
PHP_SOCKET_ERROR(php_sock, "Unable to retrieve socket option", errno);
1778+
RETURN_FALSE;
1779+
}
17811780

1782-
RETURN_LONG(other_val);
1783-
break;
1781+
if (optlen == 1) {
1782+
other_val = *((unsigned char *)&other_val);
17841783
}
1784+
1785+
RETURN_LONG(other_val);
17851786
}
17861787
/* }}} */
17871788

ext/sockets/tests/socket_strerror.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ string(13) "Exchange full"
7777
string(8) "No anode"
7878
string(20) "Invalid request code"
7979
string(12) "Invalid slot"
80-
string(16) "Unknown error 58"
80+
string(%d) "%s"
8181
string(20) "Bad font file format"
8282
string(19) "Device not a stream"
8383
string(17) "No data available"

0 commit comments

Comments
 (0)