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 {