fix: prevent writes to socket after closing (#2449)
cyan committed
Aug 12, 2025 at 09:23 UTC
1a173e7e1e4fca9a39d09c197d5e88d0a1f915b5
3 files changed
+49
-9
cw_core/lib/utils/proxy_socket/insecure.dart
+18
-3
@@ -1,4 +1,5 @@
1
2
+import 'package:cw_core/utils/print_verbose.dart';
3
import 'package:cw_core/utils/proxy_socket/abstract.dart';
4
import 'dart:async';
5
import 'dart:typed_data';
@@ -9,16 +10,30 @@ class ProxySocketInsecure implements ProxySocket {
10
11
ProxySocketInsecure(this.socket);
12
13
+ bool _isClosed = false;
14
+
15
ProxyAddress get address => ProxyAddress(host: socket.remoteAddress.host, port: socket.remotePort);
16
17
@override
15
- Future<void> close() => socket.close();
18
+ Future<void> close() {
19
+ _isClosed = true;
20
+ return socket.close();
21
+ }
22
23
@override
18
- void destroy() => socket.destroy();
24
+ void destroy() {
25
+ _isClosed = true;
26
+ socket.destroy();
27
+ }
28
29
@override
21
- void write(String data) => socket.write(data);
30
+ void write(String data) {
31
+ if (_isClosed) {
32
+ printV("ProxySocketInsecure: write: socket is closed");
33
+ return;
34
+ }
35
+ socket.write(data);
36
+ }
37
38
@override
39
StreamSubscription<List<int>> listen(Function(Uint8List event) onData, {Function(Object error)? onError, Function()? onDone, bool cancelOnError = true}) {
cw_core/lib/utils/proxy_socket/secure.dart
+18
-3
@@ -2,23 +2,38 @@ import 'dart:async';
2
import 'dart:io';
3
import 'dart:typed_data';
4
5
+import 'package:cw_core/utils/print_verbose.dart';
6
import 'package:cw_core/utils/proxy_socket/abstract.dart';
7
8
class ProxySocketSecure implements ProxySocket {
9
final SecureSocket socket;
10
11
+ bool _isClosed = false;
12
+
13
ProxySocketSecure(this.socket);
14
15
ProxyAddress get address => ProxyAddress(host: socket.remoteAddress.host, port: socket.remotePort);
16
17
@override
15
- Future<void> close() => socket.close();
18
+ Future<void> close() {
19
+ _isClosed = true;
20
+ return socket.close();
21
+ }
22
23
@override
18
- void destroy() => socket.destroy();
24
+ void destroy() {
25
+ _isClosed = true;
26
+ socket.destroy();
27
+ }
28
29
@override
21
- void write(String data) => socket.write(data);
30
+ void write(String data) {
31
+ if (_isClosed) {
32
+ printV("ProxySocketSecure: write: socket is closed");
33
+ return;
34
+ }
35
+ socket.write(data);
36
+ }
37
38
@override
39
StreamSubscription<List<int>> listen(Function(Uint8List event) onData, {Function(Object error)? onError, Function()? onDone, bool cancelOnError = true}) {
cw_core/lib/utils/proxy_socket/socks.dart
+13
-3
@@ -1,25 +1,35 @@
1
import 'dart:async';
2
import 'dart:typed_data';
3
4
+import 'package:cw_core/utils/print_verbose.dart';
5
import 'package:cw_core/utils/proxy_socket/abstract.dart';
6
import 'package:socks_socket/socks_socket.dart';
7
8
class ProxySocketSocks implements ProxySocket {
9
final SOCKSSocket socket;
9
-
10
+ bool _isClosed = false;
11
ProxySocketSocks(this.socket);
12
13
@override
14
ProxyAddress get address => ProxyAddress(host: socket.proxyHost, port: socket.proxyPort);
15
16
@override
16
- Future<void> close() => socket.close();
17
+ Future<void> close() {
18
+ _isClosed = true;
19
+ return socket.close();
20
+ }
21
22
@override
23
void destroy() => close();
24
25
@override
22
- void write(String data) => socket.write(data);
26
+ void write(String data) {
27
+ if (_isClosed) {
28
+ printV("ProxySocketSocks: write: socket is closed");
29
+ return;
30
+ }
31
+ socket.write(data);
32
+ }
33
34
@override
35
StreamSubscription<List<int>> listen(Function(Uint8List event) onData, {Function(Object error)? onError, Function()? onDone, bool cancelOnError = true}) {