mirror of
https://github.com/python/cpython.git
synced 2026-01-06 23:42:34 +00:00
gh-100795: Don't call freeaddrinfo on failure. (GH-101252)
When getaddrinfo returns an error, the output pointer is in an unknown state
Don't call freeaddrinfo on it. See the issue for discussion and details with
links to reasoning. _Most_ libc getaddrinfo implementations never modify the
output pointer unless they are returning success.
(cherry picked from commit b724ac2fe7)
Co-authored-by: Gregory P. Smith <greg@krypto.org>
Co-authored-by: Sergey G. Brester <github@sebres.de>
Co-authored-by: Oleg Iarygin <dralife@yandex.ru>
This commit is contained in:
parent
4cf4169350
commit
5964b12829
2 changed files with 7 additions and 0 deletions
|
|
@ -0,0 +1,3 @@
|
|||
Avoid potential unexpected ``freeaddrinfo`` call (double free) in :mod:`socket`
|
||||
when when a libc ``getaddrinfo()`` implementation leaves garbage in an output
|
||||
pointer when returning an error. Original patch by Sergey G. Brester.
|
||||
|
|
@ -1078,6 +1078,7 @@ setipaddr(const char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int
|
|||
subsequent call to getaddrinfo() does not destroy the
|
||||
outcome of the first call. */
|
||||
if (error) {
|
||||
res = NULL; // no-op, remind us that it is invalid; gh-100795
|
||||
set_gaierror(error);
|
||||
return -1;
|
||||
}
|
||||
|
|
@ -1188,6 +1189,7 @@ setipaddr(const char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int
|
|||
#endif
|
||||
Py_END_ALLOW_THREADS
|
||||
if (error) {
|
||||
res = NULL; // no-op, remind us that it is invalid; gh-100795
|
||||
set_gaierror(error);
|
||||
return -1;
|
||||
}
|
||||
|
|
@ -6608,6 +6610,7 @@ socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
|
|||
error = getaddrinfo(hptr, pptr, &hints, &res0);
|
||||
Py_END_ALLOW_THREADS
|
||||
if (error) {
|
||||
res0 = NULL; // gh-100795
|
||||
set_gaierror(error);
|
||||
goto err;
|
||||
}
|
||||
|
|
@ -6704,6 +6707,7 @@ socket_getnameinfo(PyObject *self, PyObject *args)
|
|||
error = getaddrinfo(hostp, pbuf, &hints, &res);
|
||||
Py_END_ALLOW_THREADS
|
||||
if (error) {
|
||||
res = NULL; // gh-100795
|
||||
set_gaierror(error);
|
||||
goto fail;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue