You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
If the port argument is a number, getaddrinfo attempts to convert it to a C long, that raises OverflowError if the conversion fails.
Instead, getaddrinfo should convert the port to a string (bytes) directly and rely on the underlying getaddrinfo to return EAI_SERVICE. This is also consistent with the case when a numeric port is passed as a string.
What do you mean by converting the port to a string (bytes) directly? Can you provide an example?
smejkar commented on Jun 20, 2017
smejkarmannequin
MannequinAuthor
More actions
Use PyObject_Str and PyUnicode_AsUTF8 if the port argument is a PyLong instead of converting it to an intermediate C long that may raise OverflowError. See getaddrinfo_overflow_error.patch
Now I understand your idea. It looks reasonable to me. Could you create a pull request on GitHub? Please provide also tests, add a Misc/NEWS entry and add your name in Misc/ACKS.
But how large is the performance hit of this change? It adds at least one additional memory allocation for the str object. If the slowdown is significant perhaps it is worth to keep the old code as a fast path.
Why can't the user simply pass in a string service name in the first place?
smejkar commented on Jun 21, 2017
smejkarmannequin
MannequinAuthor
More actions
But how large is the performance hit of this change? It adds at least one additional memory allocation for the str object. If the slowdown is significant perhaps it is worth to keep the old code as a fast path.
commit 5cc7ac2
./python -m timeit -s 'import socket' 'socket.getaddrinfo(None, 1000)'
2000 loops, best of 5: 139 usec per loop
./python -m timeit -s 'import socket' 'socket.getaddrinfo(None, "1000")'
2000 loops, best of 5: 142 usec per loop
with getaddrinfo_overflow_error.patch
./python -m timeit -s 'import socket' 'socket.getaddrinfo(None, 1000)'
2000 loops, best of 5: 140 usec per loop
./python -m timeit -s 'import socket' 'socket.getaddrinfo(None, "1000")'
2000 loops, best of 5: 139 usec per loop
It seems the impact on performance is negligible/not measurable.
I like your idea about getting rid of OverflowError. But wouldn't it make the problem with other reported by you issue, bpo-30711, worse?
smejkar commented on Jun 21, 2017
smejkarmannequin
MannequinAuthor
More actions
Why can't the user simply pass in a string service name in the first place?
He/she can. But I don't propose to change that. The patch only changes the way a given number is converted to a string. That is, without an intermediate C long.
smejkar commented on Jun 21, 2017
smejkarmannequin
MannequinAuthor
More actions
I like your idea about getting rid of OverflowError. But wouldn't it make the problem with other reported by you issue, bpo-30711, worse?
It depends on the implementation of the underlying getaddrinfo. For Modules/getaddrinfo.c, it will be worse for positive numbers outside the C long range.
The original pull request has been closed as inactive. If the original author is interested in pursuing this issue, it can be reopened or someone else can create a new pull request to replace it.
remilapeyre commented on May 29, 2020
remilapeyremannequin
Mannequin
More actions
Hi Cheryl Sabella, the pull request that got closed is the one for bpo-30711. The pull request for this one has never been reviewed.
thanks! Fixed to just rely on the underlying C library API for an error indicator or not. I'm not backporting this bugfix as it is very minor and changes in exception behavior are API changes that can be surprising, even if we don't think anything should be relying on it.
Activity
smejkar commentedon Jun 20, 2017
If the port argument is a number, getaddrinfo attempts to convert it to a C long, that raises OverflowError if the conversion fails.
Instead, getaddrinfo should convert the port to a string (bytes) directly and rely on the underlying getaddrinfo to return EAI_SERVICE. This is also consistent with the case when a numeric port is passed as a string.
serhiy-storchaka commentedon Jun 20, 2017
What do you mean by converting the port to a string (bytes) directly? Can you provide an example?
smejkar commentedon Jun 20, 2017
Use PyObject_Str and PyUnicode_AsUTF8 if the port argument is a PyLong instead of converting it to an intermediate C long that may raise OverflowError. See getaddrinfo_overflow_error.patch
serhiy-storchaka commentedon Jun 20, 2017
Now I understand your idea. It looks reasonable to me. Could you create a pull request on GitHub? Please provide also tests, add a Misc/NEWS entry and add your name in Misc/ACKS.
But how large is the performance hit of this change? It adds at least one additional memory allocation for the str object. If the slowdown is significant perhaps it is worth to keep the old code as a fast path.
benjaminp commentedon Jun 21, 2017
Why can't the user simply pass in a string service name in the first place?
smejkar commentedon Jun 21, 2017
commit 5cc7ac2
./python -m timeit -s 'import socket' 'socket.getaddrinfo(None, 1000)'
2000 loops, best of 5: 139 usec per loop
./python -m timeit -s 'import socket' 'socket.getaddrinfo(None, "1000")'
2000 loops, best of 5: 142 usec per loop
with getaddrinfo_overflow_error.patch
./python -m timeit -s 'import socket' 'socket.getaddrinfo(None, 1000)'
2000 loops, best of 5: 140 usec per loop
./python -m timeit -s 'import socket' 'socket.getaddrinfo(None, "1000")'
2000 loops, best of 5: 139 usec per loop
It seems the impact on performance is negligible/not measurable.
serhiy-storchaka commentedon Jun 21, 2017
I like your idea about getting rid of OverflowError. But wouldn't it make the problem with other reported by you issue, bpo-30711, worse?
smejkar commentedon Jun 21, 2017
smejkar commentedon Jun 21, 2017
It depends on the implementation of the underlying getaddrinfo. For Modules/getaddrinfo.c, it will be worse for positive numbers outside the C long range.
csabella commentedon May 29, 2020
The original pull request has been closed as inactive. If the original author is interested in pursuing this issue, it can be reopened or someone else can create a new pull request to replace it.
remilapeyre commentedon May 29, 2020
Hi Cheryl Sabella, the pull request that got closed is the one for bpo-30711. The pull request for this one has never been reviewed.
gh-74895: getaddrinfo no longer raises OverflowError (#2435)
gpshead commentedon Feb 14, 2023
thanks! Fixed to just rely on the underlying C library API for an error indicator or not. I'm not backporting this bugfix as it is very minor and changes in exception behavior are API changes that can be surprising, even if we don't think anything should be relying on it.
pythongh-74895: adjust tests to work on Solaris
gh-74895: adjust tests to work on Solaris (#104326)
Merge branch 'main' into fixloadsuperspec