[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 <aam@google.com> Commit-Queue: Siva Annamalai <asiva@google.com>
This commit is contained in:
+12
-1
@@ -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) {
|
||||
|
||||
@@ -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<RawSocket> implements RawServerSocket {
|
||||
|
||||
Reference in New Issue
Block a user