Selaa lähdekoodia

Return error when shutdown() fails (#2801)

Fix issue reported in #2787.
Marcin Kolny 2 vuotta sitten
vanhempi
sitoutus
5f7079f0f5

+ 2 - 5
core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src/posix.c

@@ -2877,18 +2877,15 @@ wasmtime_ssp_sock_shutdown(wasm_exec_env_t exec_env, struct fd_table *curfds,
 {
     struct fd_object *fo;
     __wasi_errno_t error;
-    int ret;
 
     error = fd_object_get(curfds, &fo, sock, 0, 0);
     if (error != 0)
         return error;
 
-    ret = os_socket_shutdown(fo->file_handle);
+    error = os_socket_shutdown(fo->file_handle);
     fd_object_release(exec_env, fo);
-    if (BHT_OK != ret)
-        return convert_errno(errno);
 
-    return __WASI_ESUCCESS;
+    return error;
 }
 
 __wasi_errno_t

+ 2 - 1
core/shared/platform/common/posix/platform_api_posix.cmake

@@ -1,6 +1,6 @@
 # Copyright (C) 2019 Intel Corporation.  All rights reserved.
 # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- 
+
 set (PLATFORM_COMMON_POSIX_DIR ${CMAKE_CURRENT_LIST_DIR})
 
 file (GLOB_RECURSE source_all ${PLATFORM_COMMON_POSIX_DIR}/*.c)
@@ -9,6 +9,7 @@ if (NOT WAMR_BUILD_LIBC_WASI EQUAL 1)
     list(REMOVE_ITEM source_all
         ${PLATFORM_COMMON_POSIX_DIR}/posix_file.c
         ${PLATFORM_COMMON_POSIX_DIR}/posix_clock.c
+        ${PLATFORM_COMMON_POSIX_DIR}/posix_socket.c
     )
 else()
     include (${CMAKE_CURRENT_LIST_DIR}/../libc-util/platform_common_libc_util.cmake)

+ 6 - 3
core/shared/platform/common/posix/posix_socket.c

@@ -5,6 +5,7 @@
 
 #include "platform_api_vmcore.h"
 #include "platform_api_extension.h"
+#include "libc_errno.h"
 
 #include <arpa/inet.h>
 #include <netdb.h>
@@ -308,11 +309,13 @@ os_socket_close(bh_socket_t socket)
     return BHT_OK;
 }
 
-int
+__wasi_errno_t
 os_socket_shutdown(bh_socket_t socket)
 {
-    shutdown(socket, O_RDWR);
-    return BHT_OK;
+    if (shutdown(socket, O_RDWR) != 0) {
+        return convert_errno(errno);
+    }
+    return __WASI_ESUCCESS;
 }
 
 int

+ 6 - 3
core/shared/platform/esp-idf/espidf_socket.c

@@ -5,6 +5,7 @@
 
 #include "platform_api_vmcore.h"
 #include "platform_api_extension.h"
+#include "libc_errno.h"
 
 #include <arpa/inet.h>
 
@@ -167,11 +168,13 @@ os_socket_close(bh_socket_t socket)
     return BHT_OK;
 }
 
-int
+__wasi_errno_t
 os_socket_shutdown(bh_socket_t socket)
 {
-    shutdown(socket, O_RDWR);
-    return BHT_OK;
+    if (shutdown(socket, O_RDWR) != 0) {
+        return convert_errno(errno);
+    }
+    return __WASI_ESUCCESS;
 }
 
 int

+ 2 - 2
core/shared/platform/include/platform_api_extension.h

@@ -573,9 +573,9 @@ os_socket_close(bh_socket_t socket);
  *
  * @param socket the socket to be shutdown
  *
- * @return always return 0
+ * @return returns corresponding error code
  */
-int
+__wasi_errno_t
 os_socket_shutdown(bh_socket_t socket);
 
 /**

+ 6 - 2
core/shared/platform/linux-sgx/sgx_socket.c

@@ -5,6 +5,7 @@
 
 #include "platform_api_vmcore.h"
 #include "platform_api_extension.h"
+#include "libc_errno.h"
 
 #ifndef SGX_DISABLE_WASI
 
@@ -855,10 +856,13 @@ os_socket_send_to(bh_socket_t socket, const void *buf, unsigned int len,
     return ret;
 }
 
-int
+__wasi_errno_t
 os_socket_shutdown(bh_socket_t socket)
 {
-    return shutdown(socket, O_RDWR);
+    if (shutdown(socket, O_RDWR) != 0) {
+        return convert_errno(errno);
+    }
+    return __WASI_ESUCCESS;
 }
 
 int

+ 1 - 45
core/shared/platform/windows/win_file.c

@@ -46,50 +46,6 @@
         CHECK_VALID_FILE_HANDLE((win_dir_stream)->handle); \
     } while (0)
 
-static __wasi_errno_t
-convert_winsock_error_code(int error_code)
-{
-    switch (error_code) {
-        case WSASYSNOTREADY:
-        case WSAEWOULDBLOCK:
-            return __WASI_EAGAIN;
-        case WSAVERNOTSUPPORTED:
-            return __WASI_ENOTSUP;
-        case WSAEINPROGRESS:
-            return __WASI_EINPROGRESS;
-        case WSAEPROCLIM:
-            return __WASI_EBUSY;
-        case WSAEFAULT:
-            return __WASI_EFAULT;
-        case WSAENETDOWN:
-            return __WASI_ENETDOWN;
-        case WSAENOTSOCK:
-            return __WASI_ENOTSOCK;
-        case WSAEINTR:
-            return __WASI_EINTR;
-        case WSAEAFNOSUPPORT:
-            return __WASI_EAFNOSUPPORT;
-        case WSAEMFILE:
-            return __WASI_ENFILE;
-        case WSAEINVAL:
-            return __WASI_EINVAL;
-        case WSAENOBUFS:
-            return __WASI_ENOBUFS;
-        case WSAEPROTONOSUPPORT:
-            return __WASI_EPROTONOSUPPORT;
-        case WSAEPROTOTYPE:
-            return __WASI_EPROTOTYPE;
-        case WSAESOCKTNOSUPPORT:
-            return __WASI_ENOTSUP;
-        case WSAEINVALIDPROCTABLE:
-        case WSAEINVALIDPROVIDER:
-        case WSAEPROVIDERFAILEDINIT:
-        case WSANOTINITIALISED:
-        default:
-            return __WASI_EINVAL;
-    }
-}
-
 static __wasi_filetype_t
 get_disk_filetype(DWORD attribute)
 {
@@ -1488,4 +1444,4 @@ os_realpath(const char *path, char *resolved_path)
         return NULL;
 
     return resolved_path;
-}
+}

+ 7 - 3
core/shared/platform/windows/win_socket.c

@@ -5,6 +5,8 @@
 
 #include "platform_api_vmcore.h"
 #include "platform_api_extension.h"
+#include "platform_wasi_types.h"
+#include "win_util.h"
 
 /* link with Ws2_32.lib */
 #pragma comment(lib, "ws2_32.lib")
@@ -238,13 +240,15 @@ os_socket_close(bh_socket_t socket)
     return BHT_OK;
 }
 
-int
+__wasi_errno_t
 os_socket_shutdown(bh_socket_t socket)
 {
     CHECK_VALID_SOCKET_HANDLE(socket);
 
-    shutdown(socket->raw.socket, SD_BOTH);
-    return BHT_OK;
+    if (shutdown(socket->raw.socket, SD_BOTH) != 0) {
+        return convert_winsock_error_code(WSAGetLastError());
+    }
+    return __WASI_ESUCCESS;
 }
 
 int

+ 51 - 1
core/shared/platform/windows/win_util.c

@@ -93,4 +93,54 @@ uwp_print_to_debugger(const char *format, va_list ap)
 
     return ret;
 }
-#endif
+#endif
+
+__wasi_errno_t
+convert_winsock_error_code(int error_code)
+{
+    switch (error_code) {
+        case WSASYSNOTREADY:
+        case WSAEWOULDBLOCK:
+            return __WASI_EAGAIN;
+        case WSAVERNOTSUPPORTED:
+            return __WASI_ENOTSUP;
+        case WSAEINPROGRESS:
+            return __WASI_EINPROGRESS;
+        case WSAEPROCLIM:
+            return __WASI_EBUSY;
+        case WSAEFAULT:
+            return __WASI_EFAULT;
+        case WSAENETDOWN:
+            return __WASI_ENETDOWN;
+        case WSAENOTSOCK:
+            return __WASI_ENOTSOCK;
+        case WSAEINTR:
+            return __WASI_EINTR;
+        case WSAEAFNOSUPPORT:
+            return __WASI_EAFNOSUPPORT;
+        case WSAEMFILE:
+            return __WASI_ENFILE;
+        case WSAEINVAL:
+            return __WASI_EINVAL;
+        case WSAENOBUFS:
+            return __WASI_ENOBUFS;
+        case WSAEPROTONOSUPPORT:
+            return __WASI_EPROTONOSUPPORT;
+        case WSAEPROTOTYPE:
+            return __WASI_EPROTOTYPE;
+        case WSAESOCKTNOSUPPORT:
+            return __WASI_ENOTSUP;
+        case WSAECONNABORTED:
+            return __WASI_ECONNABORTED;
+        case WSAECONNRESET:
+            return __WASI_ECONNRESET;
+        case WSAENOTCONN:
+            return __WASI_ENOTCONN;
+        case WSAEINVALIDPROCTABLE:
+        case WSAEINVALIDPROVIDER:
+        case WSAEPROVIDERFAILEDINIT:
+        case WSANOTINITIALISED:
+        default:
+            return __WASI_EINVAL;
+    }
+}

+ 5 - 1
core/shared/platform/windows/win_util.h

@@ -12,8 +12,12 @@
 __wasi_timestamp_t
 convert_filetime_to_wasi_timestamp(LPFILETIME filetime);
 
-// Convert a Windows error code to a WASI error code
+/* Convert a Windows error code to a WASI error code */
 __wasi_errno_t
 convert_windows_error_code(DWORD windows_error_code);
 
+/* Convert a Winsock error code to a WASI error code */
+__wasi_errno_t
+convert_winsock_error_code(int error_code);
+
 #endif /* end of _WIN_UTIL_H */