From fddbc53a640047ab6a7b7ef02e76cbdcb7b27ddf Mon Sep 17 00:00:00 2001 From: Jonas Termansen Date: Wed, 5 Feb 2020 14:26:09 +0000 Subject: [PATCH] [nnbd] Reland backporting socket option semantics from NNBD dart:io. The Socket class will now throw a SocketException if the socket has been destroyed or upgraded to a secure socket upon setting or getting socket options. The NNBD migration required making subtle changes to some dart:io semantics in order to provide a better API. This change backports one of these semantic changes to the unmigrated SDK so any issues can be discovered now instead of blocking the future SDK unfork. Change-Id: If7029f8b42fd4b05cfb79eb439c09dc206dd3b92 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/134328 Reviewed-by: Lasse R.H. Nielsen Commit-Queue: Jonas Termansen --- CHANGELOG.md | 5 +++++ sdk/lib/_internal/vm/bin/socket_patch.dart | 11 ++++------ sdk/lib/io/socket.dart | 25 ++++++++++++++++++++-- 3 files changed, 32 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c21b05c5d9a..f0316ab8b0f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,11 @@ used (see Issue [39627][]). #### `dart:io` +* The `Socket` class will now throw a `SocketException` if the socket has been + destroyed or upgraded to a secure socket upon setting or getting socket + options. Previously setting a socket options would be ignored and getting a + socket option would return `null`. + ### Dart VM ### Tools diff --git a/sdk/lib/_internal/vm/bin/socket_patch.dart b/sdk/lib/_internal/vm/bin/socket_patch.dart index e8e2bd1e390..2e75234442c 100644 --- a/sdk/lib/_internal/vm/bin/socket_patch.dart +++ b/sdk/lib/_internal/vm/bin/socket_patch.dart @@ -1779,40 +1779,37 @@ class _Socket extends Stream implements Socket { } bool setOption(SocketOption option, bool enabled) { - if (_raw == null) return false; + if (_raw == null) throw const SocketException.closed(); return _raw.setOption(option, enabled); } Uint8List getRawOption(RawSocketOption option) { - if (_raw == null) return null; + if (_raw == null) throw const SocketException.closed(); return _raw.getRawOption(option); } void setRawOption(RawSocketOption option) { - _raw?.setRawOption(option); + if (_raw == null) throw const SocketException.closed(); + _raw.setRawOption(option); } int get port { if (_raw == null) throw const SocketException.closed(); - ; return _raw.port; } InternetAddress get address { if (_raw == null) throw const SocketException.closed(); - ; return _raw.address; } int get remotePort { if (_raw == null) throw const SocketException.closed(); - ; return _raw.remotePort; } InternetAddress get remoteAddress { if (_raw == null) throw const SocketException.closed(); - ; return _raw.remoteAddress; } diff --git a/sdk/lib/io/socket.dart b/sdk/lib/io/socket.dart index 7b70858b419..2b7edeb76bd 100644 --- a/sdk/lib/io/socket.dart +++ b/sdk/lib/io/socket.dart @@ -652,21 +652,29 @@ abstract class RawSocket implements Stream { /** * Returns the port used by this socket. + * + * Throws a [SocketException] if the socket is closed. */ int get port; /** * Returns the remote port connected to by this socket. + * + * Throws a [SocketException] if the socket is closed. */ int get remotePort; /** * Returns the [InternetAddress] used to connect this socket. + * + * Throws a [SocketException] if the socket is closed. */ InternetAddress get address; /** * Returns the remote [InternetAddress] connected to by this socket. + * + * Throws a [SocketException] if the socket is closed. */ InternetAddress get remoteAddress; @@ -791,6 +799,9 @@ abstract class Socket implements Stream, IOSink { * available options. * * Returns [:true:] if the option was set successfully, false otherwise. + * + * Throws a [SocketException] if the socket has been destroyed or upgraded to + * a secure socket. */ bool setOption(SocketOption option, bool enabled); @@ -800,7 +811,8 @@ abstract class Socket implements Stream, IOSink { * * Returns the [RawSocketOption.value] on success. * - * Throws an [OSError] on failure. + * Throws an [OSError] on failure and a [SocketException] if the socket has + * been destroyed or upgraded to a secure socket. */ Uint8List getRawOption(RawSocketOption option); @@ -808,27 +820,36 @@ abstract class Socket implements Stream, IOSink { * Use [setRawOption] to customize the [RawSocket]. See [RawSocketOption] for * available options. * - * Throws an [OSError] on failure. + * Throws an [OSError] on failure and a [SocketException] if the socket has + * been destroyed or upgraded to a secure socket. */ void setRawOption(RawSocketOption option); /** * Returns the port used by this socket. + * + * Throws a [SocketException] if the socket is closed. */ int get port; /** * Returns the remote port connected to by this socket. + * + * Throws a [SocketException] if the socket is closed. */ int get remotePort; /** * Returns the [InternetAddress] used to connect this socket. + * + * Throws a [SocketException] if the socket is closed. */ InternetAddress get address; /** * Returns the remote [InternetAddress] connected to by this socket. + * + * Throws a [SocketException] if the socket is closed. */ InternetAddress get remoteAddress;