]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Pass length of result structure into setipaddr. Fixes bug #565747.
authorMartin v. Löwis <martin@v.loewis.de>
Sun, 28 Jul 2002 16:11:25 +0000 (16:11 +0000)
committerMartin v. Löwis <martin@v.loewis.de>
Sun, 28 Jul 2002 16:11:25 +0000 (16:11 +0000)
Modules/socketmodule.c

index 47ddcd54141d0b55bfce3374e638ab9b19a7fe63..55c9189cc4e6020a81f1183ee9c8d8757b899993 100644 (file)
@@ -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;