mirror of
https://github.com/python/cpython.git
synced 2025-11-03 11:23:31 +00:00
Pass length of result structure into setipaddr. Fixes bug #565747.
Committed to 2.2 branch.
This commit is contained in:
parent
2026584016
commit
ddc6f4748e
1 changed files with 12 additions and 8 deletions
|
|
@ -586,7 +586,7 @@ PyThread_type_lock gethostbyname_lock;
|
||||||
an error occurred; then an exception is raised. */
|
an error occurred; then an exception is raised. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
setipaddr(char *name, struct sockaddr *addr_ret, int af)
|
setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
|
||||||
{
|
{
|
||||||
struct addrinfo hints, *res;
|
struct addrinfo hints, *res;
|
||||||
int error;
|
int error;
|
||||||
|
|
@ -624,7 +624,9 @@ setipaddr(char *name, struct sockaddr *addr_ret, int af)
|
||||||
"wildcard resolved to multiple address");
|
"wildcard resolved to multiple address");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
memcpy(addr_ret, res->ai_addr, res->ai_addrlen);
|
if (res->ai_addrlen < addr_ret_size)
|
||||||
|
addr_ret_size = res->ai_addrlen;
|
||||||
|
memcpy(addr_ret, res->ai_addr, addr_ret_size);
|
||||||
freeaddrinfo(res);
|
freeaddrinfo(res);
|
||||||
return siz;
|
return siz;
|
||||||
}
|
}
|
||||||
|
|
@ -659,7 +661,9 @@ setipaddr(char *name, struct sockaddr *addr_ret, int af)
|
||||||
set_gaierror(error);
|
set_gaierror(error);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
memcpy((char *) addr_ret, res->ai_addr, res->ai_addrlen);
|
if (res->ai_addrlen < addr_ret_size)
|
||||||
|
addr_ret_size = res->ai_addrlen;
|
||||||
|
memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
|
||||||
freeaddrinfo(res);
|
freeaddrinfo(res);
|
||||||
switch (addr_ret->sa_family) {
|
switch (addr_ret->sa_family) {
|
||||||
case AF_INET:
|
case AF_INET:
|
||||||
|
|
@ -843,7 +847,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
|
||||||
}
|
}
|
||||||
if (!PyArg_ParseTuple(args, "si:getsockaddrarg", &host, &port))
|
if (!PyArg_ParseTuple(args, "si:getsockaddrarg", &host, &port))
|
||||||
return 0;
|
return 0;
|
||||||
if (setipaddr(host, (struct sockaddr *)addr, AF_INET) < 0)
|
if (setipaddr(host, (struct sockaddr *)addr, sizeof(*addr), AF_INET) < 0)
|
||||||
return 0;
|
return 0;
|
||||||
addr->sin_family = AF_INET;
|
addr->sin_family = AF_INET;
|
||||||
addr->sin_port = htons((short)port);
|
addr->sin_port = htons((short)port);
|
||||||
|
|
@ -864,7 +868,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
|
||||||
&scope_id)) {
|
&scope_id)) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (setipaddr(host, (struct sockaddr *)addr, AF_INET6) < 0)
|
if (setipaddr(host, (struct sockaddr *)addr, sizeof(*addr), AF_INET6) < 0)
|
||||||
return 0;
|
return 0;
|
||||||
addr->sin6_family = s->sock_family;
|
addr->sin6_family = s->sock_family;
|
||||||
addr->sin6_port = htons((short)port);
|
addr->sin6_port = htons((short)port);
|
||||||
|
|
@ -2046,7 +2050,7 @@ socket_gethostbyname(PyObject *self, PyObject *args)
|
||||||
|
|
||||||
if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
|
if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
|
||||||
return NULL;
|
return NULL;
|
||||||
if (setipaddr(name, (struct sockaddr *)&addrbuf, AF_INET) < 0)
|
if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
return makeipaddr((struct sockaddr *)&addrbuf,
|
return makeipaddr((struct sockaddr *)&addrbuf,
|
||||||
sizeof(struct sockaddr_in));
|
sizeof(struct sockaddr_in));
|
||||||
|
|
@ -2219,7 +2223,7 @@ socket_gethostbyname_ex(PyObject *self, PyObject *args)
|
||||||
|
|
||||||
if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
|
if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
|
||||||
return NULL;
|
return NULL;
|
||||||
if (setipaddr(name, (struct sockaddr *)&addr, PF_INET) < 0)
|
if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), PF_INET) < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
Py_BEGIN_ALLOW_THREADS
|
Py_BEGIN_ALLOW_THREADS
|
||||||
#ifdef HAVE_GETHOSTBYNAME_R
|
#ifdef HAVE_GETHOSTBYNAME_R
|
||||||
|
|
@ -2295,7 +2299,7 @@ socket_gethostbyaddr(PyObject *self, PyObject *args)
|
||||||
if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
|
if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
|
||||||
return NULL;
|
return NULL;
|
||||||
af = PF_UNSPEC;
|
af = PF_UNSPEC;
|
||||||
if (setipaddr(ip_num, sa, af) < 0)
|
if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
af = sa->sa_family;
|
af = sa->sa_family;
|
||||||
ap = NULL;
|
ap = NULL;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue