]> git.proxmox.com Git - mirror_edk2.git/blobdiff - StdLib/EfiSocketLib/Socket.c
Fix issues detected by python web-server.
[mirror_edk2.git] / StdLib / EfiSocketLib / Socket.c
index d6adba3237219f9ecb5ca3295f199c6ddf16431d..acb23677aa6a8650c8c88910f57764ee2282555e 100644 (file)
@@ -1259,7 +1259,10 @@ EslSocketBind (
       //\r
       //  Verify that at least one network connection was found\r
       //\r
-      if ( NULL == pSocket->pPortList ) {\r
+      if ( NULL != pSocket->pPortList ) {\r
+        Status = EFI_SUCCESS;\r
+      }\r
+      else {\r
         if ( EADDRNOTAVAIL == pSocket->errno ) {\r
           DEBUG (( DEBUG_BIND | DEBUG_POOL | DEBUG_INIT,\r
                     "ERROR - Socket address is not available!\r\n" ));\r
@@ -1993,70 +1996,60 @@ EslSocketGetLocalAddress (
     //\r
     //  Verify the socket state\r
     //\r
-    Status = EslSocketIsConfigured ( pSocket );\r
-    if ( !EFI_ERROR ( Status )) {\r
+    EslSocketIsConfigured ( pSocket );\r
+    if ( pSocket->bAddressSet ) {\r
       //\r
       //  Verify the address buffer and length address\r
       //\r
       if (( NULL != pAddress ) && ( NULL != pAddressLength )) {\r
         //\r
-        //  Verify the socket state\r
+        //  Verify the API\r
         //\r
-        if (( SOCKET_STATE_CONNECTED == pSocket->State )\r
-          || ( SOCKET_STATE_LISTENING == pSocket->State )) {\r
+        if ( NULL == pSocket->pApi->pfnLocalAddrGet ) {\r
+          Status = EFI_UNSUPPORTED;\r
+          pSocket->errno = ENOTSUP;\r
+        }\r
+        else {\r
           //\r
-          //  Verify the API\r
+          //  Synchronize with the socket layer\r
           //\r
-          if ( NULL == pSocket->pApi->pfnLocalAddrGet ) {\r
-            Status = EFI_UNSUPPORTED;\r
-            pSocket->errno = ENOTSUP;\r
-          }\r
-          else {\r
-            //\r
-            //  Synchronize with the socket layer\r
-            //\r
-            RAISE_TPL ( TplPrevious, TPL_SOCKETS );\r
+          RAISE_TPL ( TplPrevious, TPL_SOCKETS );\r
 \r
+          //\r
+          //  Verify that there is just a single connection\r
+          //\r
+          pPort = pSocket->pPortList;\r
+          if ( NULL != pPort ) {\r
             //\r
-            //  Verify that there is just a single connection\r
+            //  Verify the address length\r
             //\r
-            pPort = pSocket->pPortList;\r
-            if (( NULL != pPort ) && ( NULL == pPort->pLinkSocket )) {\r
+            LengthInBytes = pSocket->pApi->AddressLength;\r
+            if (( LengthInBytes <= *pAddressLength ) \r
+              && ( 255 >= LengthInBytes )) {\r
               //\r
-              //  Verify the address length\r
+              //  Return the local address and address length\r
               //\r
-              LengthInBytes = pSocket->pApi->AddressLength;\r
-              if (( LengthInBytes <= *pAddressLength ) \r
-                && ( 255 >= LengthInBytes )) {\r
-                //\r
-                //  Return the local address and address length\r
-                //\r
-                ZeroMem ( pAddress, LengthInBytes );\r
-                pAddress->sa_len = (uint8_t)LengthInBytes;\r
-                *pAddressLength = pAddress->sa_len;\r
-                pSocket->pApi->pfnLocalAddrGet ( pPort, pAddress );\r
-                pSocket->errno = 0;\r
-                Status = EFI_SUCCESS;\r
-              }\r
-              else {\r
-                pSocket->errno = EINVAL;\r
-                Status = EFI_INVALID_PARAMETER;\r
-              }\r
+              ZeroMem ( pAddress, LengthInBytes );\r
+              pAddress->sa_len = (uint8_t)LengthInBytes;\r
+              *pAddressLength = pAddress->sa_len;\r
+              pSocket->pApi->pfnLocalAddrGet ( pPort, pAddress );\r
+              pSocket->errno = 0;\r
+              Status = EFI_SUCCESS;\r
             }\r
             else {\r
-              pSocket->errno = ENOTCONN;\r
-              Status = EFI_NOT_STARTED;\r
+              pSocket->errno = EINVAL;\r
+              Status = EFI_INVALID_PARAMETER;\r
             }\r
-            \r
-            //\r
-            //  Release the socket layer synchronization\r
-            //\r
-            RESTORE_TPL ( TplPrevious );\r
           }\r
-        }\r
-        else {\r
-          pSocket->errno = ENOTCONN;\r
-          Status = EFI_NOT_STARTED;\r
+          else {\r
+            pSocket->errno = ENOTCONN;\r
+            Status = EFI_NOT_STARTED;\r
+          }\r
+          \r
+          //\r
+          //  Release the socket layer synchronization\r
+          //\r
+          RESTORE_TPL ( TplPrevious );\r
         }\r
       }\r
       else {\r
@@ -2064,6 +2057,13 @@ EslSocketGetLocalAddress (
         Status = EFI_INVALID_PARAMETER;\r
       }\r
     }\r
+    else {\r
+      //\r
+      //  Address not set\r
+      //\r
+      Status = EFI_NOT_STARTED;\r
+      pSocket->errno = EADDRNOTAVAIL;\r
+    }\r
   }\r
   \r
   //\r
@@ -2808,6 +2808,14 @@ EslSocketOptionGet (
         LengthInBytes = sizeof ( pSocket->MaxRxBuf );\r
         break;\r
 \r
+      case SO_REUSEADDR:\r
+        //\r
+        //  Return the address reuse flag\r
+        //\r
+        pOptionData = (UINT8 *)&pSocket->bReUseAddr;\r
+        LengthInBytes = sizeof ( pSocket->bReUseAddr );\r
+        break;\r
+      \r
       case SO_SNDBUF:\r
         //\r
         //  Return the maximum transmit buffer size\r
@@ -3032,6 +3040,14 @@ EslSocketOptionSet (
           LengthInBytes = sizeof ( pSocket->MaxRxBuf );\r
           break;\r
 \r
+        case SO_REUSEADDR:\r
+          //\r
+          //  Return the address reuse flag\r
+          //\r
+          pOptionData = (UINT8 *)&pSocket->bReUseAddr;\r
+          LengthInBytes = sizeof ( pSocket->bReUseAddr );\r
+          break;\r
+\r
         case SO_SNDBUF:\r
           //\r
           //  Send buffer size\r