From: Nikita Popov Date: Thu, 2 Jul 2020 09:44:34 +0000 (+0200) Subject: Merge branch 'PHP-7.4' X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b0dc325bbacd3d5c091c03555de02d2a3017e513;p=php Merge branch 'PHP-7.4' * PHP-7.4: Handle SO_ options only at SOL_SOCKET level Allow different error message for errno 58 --- b0dc325bbacd3d5c091c03555de02d2a3017e513 diff --cc ext/sockets/sockets.c index e305bd4790,4c9f403131..e73aae1caf --- a/ext/sockets/sockets.c +++ b/ext/sockets/sockets.c @@@ -1727,61 -2028,62 +1727,62 @@@ PHP_FUNCTION(socket_get_option } #endif - /* sol_socket options and general case */ - switch(optname) { - case SO_LINGER: - optlen = sizeof(linger_val); + if (level == SOL_SOCKET) { + switch (optname) { + case SO_LINGER: + optlen = sizeof(linger_val); - if (getsockopt(php_sock->bsd_socket, level, optname, (char*)&linger_val, &optlen) != 0) { - PHP_SOCKET_ERROR(php_sock, "Unable to retrieve socket option", errno); - RETURN_FALSE; - } + if (getsockopt(php_sock->bsd_socket, level, optname, (char*)&linger_val, &optlen) != 0) { - PHP_SOCKET_ERROR(php_sock, "unable to retrieve socket option", errno); ++ PHP_SOCKET_ERROR(php_sock, "Unable to retrieve socket option", errno); + RETURN_FALSE; + } - array_init(return_value); - add_assoc_long(return_value, "l_onoff", linger_val.l_onoff); - add_assoc_long(return_value, "l_linger", linger_val.l_linger); - break; + array_init(return_value); + add_assoc_long(return_value, "l_onoff", linger_val.l_onoff); + add_assoc_long(return_value, "l_linger", linger_val.l_linger); + return; - case SO_RCVTIMEO: - case SO_SNDTIMEO: + case SO_RCVTIMEO: + case SO_SNDTIMEO: #ifndef PHP_WIN32 - optlen = sizeof(tv); + optlen = sizeof(tv); - if (getsockopt(php_sock->bsd_socket, level, optname, (char*)&tv, &optlen) != 0) { - PHP_SOCKET_ERROR(php_sock, "Unable to retrieve socket option", errno); - RETURN_FALSE; - } + if (getsockopt(php_sock->bsd_socket, level, optname, (char*)&tv, &optlen) != 0) { - PHP_SOCKET_ERROR(php_sock, "unable to retrieve socket option", errno); ++ PHP_SOCKET_ERROR(php_sock, "Unable to retrieve socket option", errno); + RETURN_FALSE; + } #else - optlen = sizeof(int); + optlen = sizeof(int); - if (getsockopt(php_sock->bsd_socket, level, optname, (char*)&timeout, &optlen) != 0) { - PHP_SOCKET_ERROR(php_sock, "Unable to retrieve socket option", errno); - RETURN_FALSE; - } + if (getsockopt(php_sock->bsd_socket, level, optname, (char*)&timeout, &optlen) != 0) { - PHP_SOCKET_ERROR(php_sock, "unable to retrieve socket option", errno); ++ PHP_SOCKET_ERROR(php_sock, "Unable to retrieve socket option", errno); + RETURN_FALSE; + } - tv.tv_sec = timeout ? timeout / 1000 : 0; - tv.tv_usec = timeout ? (timeout * 1000) % 1000000 : 0; + tv.tv_sec = timeout ? timeout / 1000 : 0; + tv.tv_usec = timeout ? (timeout * 1000) % 1000000 : 0; #endif - array_init(return_value); + array_init(return_value); - add_assoc_long(return_value, "sec", tv.tv_sec); - add_assoc_long(return_value, "usec", tv.tv_usec); - break; + add_assoc_long(return_value, "sec", tv.tv_sec); + add_assoc_long(return_value, "usec", tv.tv_usec); + return; + } + } - default: - optlen = sizeof(other_val); + optlen = sizeof(other_val); - if (getsockopt(php_sock->bsd_socket, level, optname, (char*)&other_val, &optlen) != 0) { - PHP_SOCKET_ERROR(php_sock, "Unable to retrieve socket option", errno); - RETURN_FALSE; - } - if (optlen == 1) - other_val = *((unsigned char *)&other_val); + if (getsockopt(php_sock->bsd_socket, level, optname, (char*)&other_val, &optlen) != 0) { - PHP_SOCKET_ERROR(php_sock, "unable to retrieve socket option", errno); ++ PHP_SOCKET_ERROR(php_sock, "Unable to retrieve socket option", errno); + RETURN_FALSE; + } - RETURN_LONG(other_val); - break; + if (optlen == 1) { + other_val = *((unsigned char *)&other_val); } + + RETURN_LONG(other_val); } /* }}} */