Make BIO_sock_error return a proper error code when getsockopt fails
authorRichard Levitte <levitte@openssl.org>
Thu, 28 Apr 2016 11:19:38 +0000 (13:19 +0200)
committerRichard Levitte <levitte@openssl.org>
Thu, 28 Apr 2016 12:04:03 +0000 (14:04 +0200)
BIO_sock_error() returned 1 when getsockopt() fails when it should
return the error code for that failure.

Additionally, the optlen parameter to getsockopt() has to point at
the size of the area that the optval parameter points at rather than
zero.  Some systems may forgive it being zero, but others don't.

Reviewed-by: Matt Caswell <matt@openssl.org>
crypto/bio/b_sock.c

index a2d0100bb368c2342bd08398886062a7e1e0ee0b..071acda48e83e6fdbbaffa9b4f68c89ed44bc40b 100644 (file)
@@ -141,7 +141,7 @@ int BIO_get_port(const char *str, unsigned short *port_ptr)
 int BIO_sock_error(int sock)
 {
     int j = 0, i;
 int BIO_sock_error(int sock)
 {
     int j = 0, i;
-    socklen_t size = 0;
+    socklen_t size = sizeof(j);
 
     /*
      * Note: under Windows the third parameter is of type (char *) whereas
 
     /*
      * Note: under Windows the third parameter is of type (char *) whereas
@@ -151,7 +151,7 @@ int BIO_sock_error(int sock)
      */
     i = getsockopt(sock, SOL_SOCKET, SO_ERROR, (void *)&j, &size);
     if (i < 0)
      */
     i = getsockopt(sock, SOL_SOCKET, SO_ERROR, (void *)&j, &size);
     if (i < 0)
-        return (1);
+        return (get_last_socket_error());
     else
         return (j);
 }
     else
         return (j);
 }