diff Modules/socketmodule.c @ 24412:4708c09f0350 2.2

Pass length of result structure into setipaddr. Fixes bug #565747.
author Martin v. Löwis <martin@v.loewis.de>
date Sun, 28 Jul 2002 16:11:25 +0000
parents 2b1219a72efc
children 734f89c194dd
line wrap: on
line diff
--- a/Modules/socketmodule.c	Sun Jul 28 13:56:20 2002 +0000
+++ b/Modules/socketmodule.c	Sun Jul 28 16:11:25 2002 +0000
@@ -583,7 +583,7 @@
    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 @@
 				"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 @@
 		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 @@
 		}
 		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 @@
 				&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 @@
 
 	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 @@
 
 	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 @@
 	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;