Skip to content

Commit 47c6e16

Browse files
committed
fix a mem leak
1 parent 8826f51 commit 47c6e16

File tree

3 files changed

+15
-11
lines changed

3 files changed

+15
-11
lines changed

shadowsocks/common.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,7 @@ def __init__(self, params):
352352
def resolve(self, dns_resolver, remote_addr, call_back):
353353
if remote_addr in UDPAsyncDNSHandler.dns_cache:
354354
if call_back:
355-
call_back(remote_addr, UDPAsyncDNSHandler.dns_cache[remote_addr], self.params)
355+
call_back("", remote_addr, UDPAsyncDNSHandler.dns_cache[remote_addr], self.params)
356356
else:
357357
self.call_back = call_back
358358
self.remote_addr = remote_addr
@@ -362,14 +362,13 @@ def resolve(self, dns_resolver, remote_addr, call_back):
362362
def _handle_dns_resolved(self, result, error):
363363
if error:
364364
logging.error("%s when resolve DNS" % (error,)) #drop
365-
return
365+
return self.call_back(error, self.remote_addr, None, self.params)
366366
if result:
367367
ip = result[1]
368368
if ip:
369-
if self.call_back:
370-
self.call_back(self.remote_addr, ip, self.params)
371-
return
369+
return self.call_back("", self.remote_addr, ip, self.params)
372370
logging.warning("can't resolve %s" % (self.remote_addr,))
371+
return self.call_back("fail to resolve", self.remote_addr, None, self.params)
373372

374373
def test_inet_conv():
375374
ipv4 = b'8.8.4.4'

shadowsocks/tcprelay.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -347,9 +347,9 @@ def _write_to_sock(self, data, sock):
347347
handler = common.UDPAsyncDNSHandler(data[header_length:])
348348
handler.resolve(self._dns_resolver, (dest_addr, dest_port), self._handle_server_dns_resolved)
349349
else:
350-
return self._handle_server_dns_resolved((dest_addr, dest_port), dest_addr, data[header_length:])
350+
return self._handle_server_dns_resolved("", (dest_addr, dest_port), dest_addr, data[header_length:])
351351
else:
352-
return self._handle_server_dns_resolved((dest_addr, dest_port), dest_addr, data[header_length:])
352+
return self._handle_server_dns_resolved("", (dest_addr, dest_port), dest_addr, data[header_length:])
353353

354354
except Exception as e:
355355
#trace = traceback.format_exc()
@@ -412,7 +412,10 @@ def _write_to_sock(self, data, sock):
412412
logging.error('write_all_to_sock:unknown socket from %s:%d' % (self._client_address[0], self._client_address[1]))
413413
return True
414414

415-
def _handle_server_dns_resolved(self, remote_addr, server_addr, data):
415+
def _handle_server_dns_resolved(self, error, remote_addr, server_addr, data):
416+
if error:
417+
self.destroy()
418+
return
416419
try:
417420
addrs = socket.getaddrinfo(server_addr, remote_addr[1], 0, socket.SOCK_DGRAM, socket.SOL_UDP)
418421
if not addrs: # drop

shadowsocks/udprelay.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -388,11 +388,13 @@ def _handle_server(self):
388388
handler = common.UDPAsyncDNSHandler((data, r_addr, uid, header_length))
389389
handler.resolve(self._dns_resolver, (server_addr, server_port), self._handle_server_dns_resolved)
390390
else:
391-
self._handle_server_dns_resolved((server_addr, server_port), server_addr, (data, r_addr, uid, header_length))
391+
self._handle_server_dns_resolved("", (server_addr, server_port), server_addr, (data, r_addr, uid, header_length))
392392
else:
393-
self._handle_server_dns_resolved((server_addr, server_port), server_addr, (data, r_addr, uid, header_length))
393+
self._handle_server_dns_resolved("", (server_addr, server_port), server_addr, (data, r_addr, uid, header_length))
394394

395-
def _handle_server_dns_resolved(self, remote_addr, server_addr, params):
395+
def _handle_server_dns_resolved(self, error, remote_addr, server_addr, params):
396+
if error:
397+
return
396398
data, r_addr, uid, header_length = params
397399
user_id = self._listen_port
398400
try:

0 commit comments

Comments
 (0)