From 4f76b9535da02b6b2ffd8c88787cecff644149ed Mon Sep 17 00:00:00 2001 From: asiva Date: Mon, 4 Apr 2022 21:34:21 +0000 Subject: [PATCH] [VM / IO] Assert When a socket exception is being thrown with an error code of 0. TEST=ci Change-Id: Ie0ea5329dfe0307f47fc04db693dae4e352d0f64 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/239846 Reviewed-by: Alexander Aprelev Commit-Queue: Siva Annamalai --- runtime/bin/socket.cc | 13 ++++++++++++- sdk/lib/_internal/vm/bin/socket_patch.dart | 16 +++++++++++----- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/runtime/bin/socket.cc b/runtime/bin/socket.cc index 21bfadf3cff..708bda49461 100644 --- a/runtime/bin/socket.cc +++ b/runtime/bin/socket.cc @@ -914,7 +914,18 @@ void FUNCTION_NAME(Socket_GetError)(Dart_NativeArguments args) { Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); OSError os_error; SocketBase::GetError(socket->fd(), &os_error); - Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error)); + if (os_error.code() != 0) { + Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error)); + } else { + Dart_SetReturnValue(args, Dart_Null()); + } +} + +void FUNCTION_NAME(Socket_Fatal)(Dart_NativeArguments args) { + Dart_Handle msg = Dart_GetNativeArgument(args, 0); + const char* msgStr = + (!Dart_IsNull(msg)) ? DartUtils::GetStringValue(msg) : nullptr; + FATAL("Fatal error in dart:io (socket): %s", msgStr); } void FUNCTION_NAME(Socket_GetFD)(Dart_NativeArguments args) { diff --git a/sdk/lib/_internal/vm/bin/socket_patch.dart b/sdk/lib/_internal/vm/bin/socket_patch.dart index 7c9925a83c2..d0bddf85fbf 100644 --- a/sdk/lib/_internal/vm/bin/socket_patch.dart +++ b/sdk/lib/_internal/vm/bin/socket_patch.dart @@ -877,8 +877,8 @@ class _NativeSocket extends _NativeSocketNativeWrapper with _ServiceObject { // the SO_ERROR option at level SOL_SOCKET to determine whether // connect() completed successfully (SO_ERROR is zero) or // unsuccessfully. - final OSError osError = socket.nativeGetError(); - if (osError.errorCode != 0) { + final osError = socket.nativeGetError(); + if (osError != null) { socket.close(); error ??= osError; connectNext(); @@ -1404,8 +1404,12 @@ class _NativeSocket extends _NativeSocketNativeWrapper with _ServiceObject { if (i == errorEvent) { if (!isClosing) { - final err = nativeGetError(); - reportError(err, null, err.message); + final osError = nativeGetError(); + if (osError == null) { + _nativeFatal("Reporting error with OSError code of 0"); + } else { + reportError(osError, null, osError.message); + } } } else if (!isClosed) { // If the connection is closed right after it's accepted, there's a @@ -1688,7 +1692,7 @@ class _NativeSocket extends _NativeSocketNativeWrapper with _ServiceObject { @pragma("vm:external-name", "Socket_GetFD") external int get fd; @pragma("vm:external-name", "Socket_GetError") - external OSError nativeGetError(); + external OSError? nativeGetError(); @pragma("vm:external-name", "Socket_GetOption") external nativeGetOption(int option, int protocol); @pragma("vm:external-name", "Socket_GetRawOption") @@ -1703,6 +1707,8 @@ class _NativeSocket extends _NativeSocketNativeWrapper with _ServiceObject { @pragma("vm:external-name", "Socket_LeaveMulticast") external void nativeLeaveMulticast( Uint8List addr, Uint8List? interfaceAddr, int interfaceIndex); + @pragma("vm:external-name", "Socket_Fatal") + external static void _nativeFatal(msg); } class _RawServerSocket extends Stream implements RawServerSocket {