From: Martin v. Löwis Date: Sun, 28 Jul 2002 16:11:25 +0000 (+0000) Subject: Pass length of result structure into setipaddr. Fixes bug #565747. X-Git-Tag: v2.2.2b1~253 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=1cbac94be1b888fd9374ebf7d5829dba9ed73416;p=thirdparty%2FPython%2Fcpython.git Pass length of result structure into setipaddr. Fixes bug #565747. --- diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index 47ddcd54141d..55c9189cc4e6 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -583,7 +583,7 @@ PyThread_type_lock gethostbyname_lock; an error occurred; then an exception is raised. */ 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; int error; @@ -621,7 +621,9 @@ setipaddr(char* name, struct sockaddr * addr_ret, int af) "wildcard resolved to multiple address"); 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); return siz; } @@ -656,7 +658,9 @@ setipaddr(char* name, struct sockaddr * addr_ret, int af) PyGAI_Err(error); 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); switch (addr_ret->sa_family) { case AF_INET: @@ -831,7 +835,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, } if (!PyArg_ParseTuple(args, "si:getsockaddrarg", &host, &port)) return 0; - if (setipaddr(host, (struct sockaddr *)addr, AF_INET) < 0) + if (setipaddr(host, (struct sockaddr *)addr, sizeof(*addr), AF_INET) < 0) return 0; addr->sin_family = AF_INET; addr->sin_port = htons((short)port); @@ -852,7 +856,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, &scope_id)) { return 0; } - if (setipaddr(host, (struct sockaddr *)addr, AF_INET6) < 0) + if (setipaddr(host, (struct sockaddr *)addr, sizeof(*addr), AF_INET6) < 0) return 0; addr->sin6_family = s->sock_family; addr->sin6_port = htons((short)port); @@ -1961,7 +1965,7 @@ PySocket_gethostbyname(PyObject *self, PyObject *args) if (!PyArg_ParseTuple(args, "s:gethostbyname", &name)) 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 makeipaddr((struct sockaddr *)&addrbuf, sizeof(struct sockaddr_in)); @@ -2110,7 +2114,7 @@ PySocket_gethostbyname_ex(PyObject *self, PyObject *args) if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name)) return NULL; - if (setipaddr(name, (struct sockaddr *)&addr, PF_INET) < 0) + if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), PF_INET) < 0) return NULL; Py_BEGIN_ALLOW_THREADS #ifdef HAVE_GETHOSTBYNAME_R @@ -2182,7 +2186,7 @@ PySocket_gethostbyaddr(PyObject *self, PyObject *args) if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num)) return NULL; af = PF_UNSPEC; - if (setipaddr(ip_num, sa, af) < 0) + if (setipaddr(ip_num, sa, sizeof(addr), af) < 0) return NULL; af = sa->sa_family; ap = NULL;