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:
Miss Islington (bot) 2023-01-23 15:27:41 -08:00 committed by GitHub
parent e24c73e71e
commit 8126628107
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 7 additions and 0 deletions

View file

@ -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.

View file

@ -1053,6 +1053,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;
}
@ -1163,6 +1164,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;
}
@ -6514,6 +6516,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;
}
@ -6608,6 +6611,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;
}