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;