Mercurial > cpython-lru_cache-weakref
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; |
