GH-123599: Match file: URL hostname against machine hostname in urllib (#132523)

In `_is_local_authority()`, return early if the authority matches the
machine hostname from `socket.gethostname()`, rather than resolving the
names and matching IP addresses.
This commit is contained in:
Barney Gale 2025-04-15 01:05:06 +01:00 committed by GitHub
parent 102f825c51
commit 0879ebc953
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 12 additions and 3 deletions

View file

@ -199,9 +199,9 @@ The :mod:`urllib.request` module defines the following functions:
.. versionchanged:: next
This function calls :func:`socket.gethostbyname` if the URL authority
isn't empty or ``localhost``. If the authority resolves to a local IP
address then it is discarded; otherwise, on Windows a UNC path is
returned (as before), and on other platforms a
isn't empty, ``localhost``, or the machine hostname. If the authority
resolves to a local IP address then it is discarded; otherwise, on
Windows a UNC path is returned (as before), and on other platforms a
:exc:`~urllib.error.URLError` is raised.
.. versionchanged:: next

View file

@ -1483,8 +1483,17 @@ class FileHandler(BaseHandler):
file_open = open_local_file
def _is_local_authority(authority):
# Compare hostnames
if not authority or authority == 'localhost':
return True
try:
hostname = socket.gethostname()
except (socket.gaierror, AttributeError):
pass
else:
if authority == hostname:
return True
# Compare IP addresses
try:
address = socket.gethostbyname(authority)
except (socket.gaierror, AttributeError):