]> granicus.if.org Git - php/commitdiff
Merge branch 'PHP-7.4'
authorNikita Popov <nikita.ppv@gmail.com>
Thu, 2 Jul 2020 09:44:34 +0000 (11:44 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Thu, 2 Jul 2020 09:44:34 +0000 (11:44 +0200)
* PHP-7.4:
  Handle SO_ options only at SOL_SOCKET level
  Allow different error message for errno 58

1  2 
ext/sockets/sockets.c
ext/sockets/tests/socket_strerror.phpt

index e305bd479015dbeb428e5d2f21fe13a3a810a51e,4c9f403131fe1badb0cdb34d467533ad263c0227..e73aae1caf7e2f1f2f216e0df53217899db9af04
@@@ -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);
  }
  /* }}} */