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}) {