|
8 | 8 | "os" |
9 | 9 | "runtime" |
10 | 10 | "strings" |
| 11 | + "sync" |
11 | 12 | "sync/atomic" |
12 | 13 | "time" |
13 | 14 |
|
@@ -104,18 +105,25 @@ type Proxy struct { |
104 | 105 | SourceDNSCrypt bool |
105 | 106 | SourceDoH bool |
106 | 107 | SourceODoH bool |
| 108 | + listenersMu sync.Mutex |
107 | 109 | } |
108 | 110 |
|
109 | 111 | func (proxy *Proxy) registerUDPListener(conn *net.UDPConn) { |
| 112 | + proxy.listenersMu.Lock() |
110 | 113 | proxy.udpListeners = append(proxy.udpListeners, conn) |
| 114 | + proxy.listenersMu.Unlock() |
111 | 115 | } |
112 | 116 |
|
113 | 117 | func (proxy *Proxy) registerTCPListener(listener *net.TCPListener) { |
| 118 | + proxy.listenersMu.Lock() |
114 | 119 | proxy.tcpListeners = append(proxy.tcpListeners, listener) |
| 120 | + proxy.listenersMu.Unlock() |
115 | 121 | } |
116 | 122 |
|
117 | 123 | func (proxy *Proxy) registerLocalDoHListener(listener *net.TCPListener) { |
| 124 | + proxy.listenersMu.Lock() |
118 | 125 | proxy.localDoHListeners = append(proxy.localDoHListeners, listener) |
| 126 | + proxy.listenersMu.Unlock() |
119 | 127 | } |
120 | 128 |
|
121 | 129 | func (proxy *Proxy) addDNSListener(listenAddrStr string) { |
@@ -168,23 +176,29 @@ func (proxy *Proxy) addDNSListener(listenAddrStr string) { |
168 | 176 | } |
169 | 177 | defer listenerUDP.Close() |
170 | 178 | defer listenerTCP.Close() |
| 179 | + FileDescriptorsMu.Lock() |
171 | 180 | FileDescriptors = append(FileDescriptors, fdUDP) |
172 | 181 | FileDescriptors = append(FileDescriptors, fdTCP) |
| 182 | + FileDescriptorsMu.Unlock() |
173 | 183 | return |
174 | 184 | } |
175 | 185 |
|
176 | 186 | // child |
| 187 | + FileDescriptorsMu.Lock() |
177 | 188 | listenerUDP, err := net.FilePacketConn(os.NewFile(InheritedDescriptorsBase+FileDescriptorNum, "listenerUDP")) |
178 | 189 | if err != nil { |
| 190 | + FileDescriptorsMu.Unlock() |
179 | 191 | dlog.Fatalf("Unable to switch to a different user: %v", err) |
180 | 192 | } |
181 | 193 | FileDescriptorNum++ |
182 | 194 |
|
183 | 195 | listenerTCP, err := net.FileListener(os.NewFile(InheritedDescriptorsBase+FileDescriptorNum, "listenerTCP")) |
184 | 196 | if err != nil { |
| 197 | + FileDescriptorsMu.Unlock() |
185 | 198 | dlog.Fatalf("Unable to switch to a different user: %v", err) |
186 | 199 | } |
187 | 200 | FileDescriptorNum++ |
| 201 | + FileDescriptorsMu.Unlock() |
188 | 202 |
|
189 | 203 | dlog.Noticef("Now listening to %v [UDP]", listenUDPAddr) |
190 | 204 | proxy.registerUDPListener(listenerUDP.(*net.UDPConn)) |
|
0 commit comments