mirror of
https://github.com/LBRYFoundation/LBRY-Vault.git
synced 2025-08-23 17:47:31 +00:00
don't dns resolve raw IP addresses
This commit is contained in:
parent
e2b6d2d0f7
commit
c6124549cd
1 changed files with 31 additions and 18 deletions
|
@ -32,12 +32,14 @@ import threading
|
||||||
import socket
|
import socket
|
||||||
import json
|
import json
|
||||||
import sys
|
import sys
|
||||||
|
import ipaddress
|
||||||
|
|
||||||
import dns
|
import dns
|
||||||
import dns.resolver
|
import dns.resolver
|
||||||
import socks
|
import socks
|
||||||
|
|
||||||
from . import util
|
from . import util
|
||||||
|
from .util import print_error
|
||||||
from . import bitcoin
|
from . import bitcoin
|
||||||
from .bitcoin import COIN
|
from .bitcoin import COIN
|
||||||
from . import constants
|
from . import constants
|
||||||
|
@ -452,27 +454,38 @@ class Network(util.DaemonThread):
|
||||||
# On Windows, socket.getaddrinfo takes a mutex, and might hold it for up to 10 seconds
|
# On Windows, socket.getaddrinfo takes a mutex, and might hold it for up to 10 seconds
|
||||||
# when dns-resolving. To speed it up drastically, we resolve dns ourselves, outside that lock.
|
# when dns-resolving. To speed it up drastically, we resolve dns ourselves, outside that lock.
|
||||||
# see #4421
|
# see #4421
|
||||||
def fast_getaddrinfo(host, *args, **kwargs):
|
socket.getaddrinfo = self._fast_getaddrinfo
|
||||||
try:
|
|
||||||
if str(host) not in ('localhost', 'localhost.',):
|
|
||||||
answers = dns.resolver.query(host)
|
|
||||||
addr = str(answers[0])
|
|
||||||
else:
|
|
||||||
addr = host
|
|
||||||
except dns.exception.DNSException:
|
|
||||||
# dns failed for some reason, e.g. dns.resolver.NXDOMAIN
|
|
||||||
# this is normal. Simply report back failure:
|
|
||||||
raise socket.gaierror(11001, 'getaddrinfo failed')
|
|
||||||
except BaseException as e:
|
|
||||||
# Possibly internal error in dnspython :( see #4483
|
|
||||||
# Fall back to original socket.getaddrinfo to resolve dns.
|
|
||||||
self.print_error('dnspython failed to resolve dns with error:', e)
|
|
||||||
addr = host
|
|
||||||
return socket._getaddrinfo(addr, *args, **kwargs)
|
|
||||||
socket.getaddrinfo = fast_getaddrinfo
|
|
||||||
else:
|
else:
|
||||||
socket.getaddrinfo = socket._getaddrinfo
|
socket.getaddrinfo = socket._getaddrinfo
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _fast_getaddrinfo(host, *args, **kwargs):
|
||||||
|
def needs_dns_resolving(host2):
|
||||||
|
try:
|
||||||
|
ipaddress.ip_address(host2)
|
||||||
|
return False # already valid IP
|
||||||
|
except ValueError:
|
||||||
|
pass # not an IP
|
||||||
|
if str(host) in ('localhost', 'localhost.',):
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
try:
|
||||||
|
if needs_dns_resolving(host):
|
||||||
|
answers = dns.resolver.query(host)
|
||||||
|
addr = str(answers[0])
|
||||||
|
else:
|
||||||
|
addr = host
|
||||||
|
except dns.exception.DNSException:
|
||||||
|
# dns failed for some reason, e.g. dns.resolver.NXDOMAIN
|
||||||
|
# this is normal. Simply report back failure:
|
||||||
|
raise socket.gaierror(11001, 'getaddrinfo failed')
|
||||||
|
except BaseException as e:
|
||||||
|
# Possibly internal error in dnspython :( see #4483
|
||||||
|
# Fall back to original socket.getaddrinfo to resolve dns.
|
||||||
|
print_error('dnspython failed to resolve dns with error:', e)
|
||||||
|
addr = host
|
||||||
|
return socket._getaddrinfo(addr, *args, **kwargs)
|
||||||
|
|
||||||
@with_interface_lock
|
@with_interface_lock
|
||||||
def start_network(self, protocol, proxy):
|
def start_network(self, protocol, proxy):
|
||||||
assert not self.interface and not self.interfaces
|
assert not self.interface and not self.interfaces
|
||||||
|
|
Loading…
Add table
Reference in a new issue