comparison Modules/socketmodule.c @ 87134:7cd4c3e9e310

Fix sock_recvfrom_guts(): recvfrom() size is limited to an int on Windows, not on other OSes!
author Victor Stinner <victor.stinner@gmail.com>
date Sat, 16 Nov 2013 00:18:58 +0100
parents a21f506d04c9
children 9bbada125b3f
comparison
equal deleted inserted replaced
87133:309d855ebc3e 87134:7cd4c3e9e310
838 memcpy(addr_ret, res->ai_addr, addr_ret_size); 838 memcpy(addr_ret, res->ai_addr, addr_ret_size);
839 freeaddrinfo(res); 839 freeaddrinfo(res);
840 return siz; 840 return siz;
841 } 841 }
842 /* special-case broadcast - inet_addr() below can return INADDR_NONE for 842 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
843 * this */ 843 * this */
844 if (strcmp(name, "255.255.255.255") == 0 || 844 if (strcmp(name, "255.255.255.255") == 0 ||
845 strcmp(name, "<broadcast>") == 0) { 845 strcmp(name, "<broadcast>") == 0) {
846 struct sockaddr_in *sin; 846 struct sockaddr_in *sin;
847 if (af != AF_INET && af != AF_UNSPEC) { 847 if (af != AF_INET && af != AF_UNSPEC) {
848 PyErr_SetString(PyExc_OSError, 848 PyErr_SetString(PyExc_OSError,
899 #ifdef HAVE_SOCKADDR_SA_LEN 899 #ifdef HAVE_SOCKADDR_SA_LEN
900 sin->sin_len = sizeof(*sin); 900 sin->sin_len = sizeof(*sin);
901 #endif 901 #endif
902 return 4; 902 return 4;
903 } 903 }
904 } 904 }
905 #endif /* HAVE_INET_PTON */ 905 #endif /* HAVE_INET_PTON */
906 906
907 /* perform a name resolution */ 907 /* perform a name resolution */
908 memset(&hints, 0, sizeof(hints)); 908 memset(&hints, 0, sizeof(hints));
909 hints.ai_family = af; 909 hints.ai_family = af;
2831 BEGIN_SELECT_LOOP(s) 2831 BEGIN_SELECT_LOOP(s)
2832 Py_BEGIN_ALLOW_THREADS 2832 Py_BEGIN_ALLOW_THREADS
2833 memset(&addrbuf, 0, addrlen); 2833 memset(&addrbuf, 0, addrlen);
2834 timeout = internal_select_ex(s, 0, interval); 2834 timeout = internal_select_ex(s, 0, interval);
2835 if (!timeout) { 2835 if (!timeout) {
2836 #ifndef MS_WINDOWS 2836 #ifdef MS_WINDOWS
2837 if (len > INT_MAX) 2837 if (len > INT_MAX)
2838 len = INT_MAX; 2838 len = INT_MAX;
2839 n = recvfrom(s->sock_fd, cbuf, (int)len, flags, 2839 n = recvfrom(s->sock_fd, cbuf, (int)len, flags,
2840 (void *) &addrbuf, &addrlen); 2840 (void *) &addrbuf, &addrlen);
2841 #else 2841 #else
4700 } 4700 }
4701 #else 4701 #else
4702 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */ 4702 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
4703 newfd = _Py_dup(fd); 4703 newfd = _Py_dup(fd);
4704 if (newfd == INVALID_SOCKET) 4704 if (newfd == INVALID_SOCKET)
4705 return NULL; 4705 return NULL;
4706 #endif 4706 #endif
4707 4707
4708 newfdobj = PyLong_FromSocket_t(newfd); 4708 newfdobj = PyLong_FromSocket_t(newfd);
4709 if (newfdobj == NULL) 4709 if (newfdobj == NULL)
4710 SOCKETCLOSE(newfd); 4710 SOCKETCLOSE(newfd);
5091 5091
5092 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) { 5092 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5093 return NULL; 5093 return NULL;
5094 } 5094 }
5095 5095
5096 size = sizeof(addr); 5096 size = sizeof(addr);
5097 ret = WSAStringToAddressA(ip, af, NULL, (LPSOCKADDR)&addr, &size); 5097 ret = WSAStringToAddressA(ip, af, NULL, (LPSOCKADDR)&addr, &size);
5098 5098
5099 if (ret) { 5099 if (ret) {
5100 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError()); 5100 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5101 return NULL; 5101 return NULL;
5102 } else if(af == AF_INET) { 5102 } else if(af == AF_INET) {
5103 struct sockaddr_in *addr4 = (struct sockaddr_in*)&addr; 5103 struct sockaddr_in *addr4 = (struct sockaddr_in*)&addr;
5104 return PyBytes_FromStringAndSize((const char *)&(addr4->sin_addr), 5104 return PyBytes_FromStringAndSize((const char *)&(addr4->sin_addr),
5105 sizeof(addr4->sin_addr)); 5105 sizeof(addr4->sin_addr));
5106 } else if (af == AF_INET6) { 5106 } else if (af == AF_INET6) {
5107 return PyBytes_FromStringAndSize((const char *)&(addr.sin6_addr), 5107 return PyBytes_FromStringAndSize((const char *)&(addr.sin6_addr),
5108 sizeof(addr.sin6_addr)); 5108 sizeof(addr.sin6_addr));
5109 } else { 5109 } else {
5110 PyErr_SetString(PyExc_OSError, "unknown address family"); 5110 PyErr_SetString(PyExc_OSError, "unknown address family");
5111 return NULL; 5111 return NULL;
5112 } 5112 }
5229 "unknown address family %d", af); 5229 "unknown address family %d", af);
5230 return NULL; 5230 return NULL;
5231 } 5231 }
5232 5232
5233 retlen = sizeof(ip); 5233 retlen = sizeof(ip);
5234 ret = WSAAddressToStringA((struct sockaddr*)&addr, addrlen, NULL, 5234 ret = WSAAddressToStringA((struct sockaddr*)&addr, addrlen, NULL,
5235 ip, &retlen); 5235 ip, &retlen);
5236 5236
5237 if (ret) { 5237 if (ret) {
5238 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError()); 5238 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5239 return NULL; 5239 return NULL;