@@ -1094,33 +1094,25 @@ setipaddr(const char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int
10941094}
10951095
10961096
1097- /* Convert IPv4 sockaddr to a Python str. */
1097+ /* Create a string object representing an IP address.
1098+ This is always a string of the form 'dd.dd.dd.dd' (with variable
1099+ size numbers). */
10981100
10991101static PyObject *
1100- make_ipv4_addr ( const struct sockaddr_in * addr )
1102+ makeipaddr ( struct sockaddr * addr , int addrlen )
11011103{
1102- char buf [INET_ADDRSTRLEN ];
1103- if (inet_ntop (AF_INET , & addr -> sin_addr , buf , sizeof (buf )) == NULL ) {
1104- PyErr_SetFromErrno (PyExc_OSError );
1105- return NULL ;
1106- }
1107- return PyUnicode_FromString (buf );
1108- }
1109-
1110- #ifdef ENABLE_IPV6
1111- /* Convert IPv6 sockaddr to a Python str. */
1104+ char buf [NI_MAXHOST ];
1105+ int error ;
11121106
1113- static PyObject *
1114- make_ipv6_addr (const struct sockaddr_in6 * addr )
1115- {
1116- char buf [INET6_ADDRSTRLEN ];
1117- if (inet_ntop (AF_INET6 , & addr -> sin6_addr , buf , sizeof (buf )) == NULL ) {
1118- PyErr_SetFromErrno (PyExc_OSError );
1107+ error = getnameinfo (addr , addrlen , buf , sizeof (buf ), NULL , 0 ,
1108+ NI_NUMERICHOST );
1109+ if (error ) {
1110+ set_gaierror (error );
11191111 return NULL ;
11201112 }
11211113 return PyUnicode_FromString (buf );
11221114}
1123- #endif
1115+
11241116
11251117#ifdef USE_BLUETOOTH
11261118/* Convert a string representation of a Bluetooth address into a numeric
@@ -1185,10 +1177,11 @@ makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
11851177
11861178 case AF_INET :
11871179 {
1188- const struct sockaddr_in * a = ( const struct sockaddr_in * ) addr ;
1189- PyObject * addrobj = make_ipv4_addr ( a );
1180+ struct sockaddr_in * a ;
1181+ PyObject * addrobj = makeipaddr ( addr , sizeof ( * a ) );
11901182 PyObject * ret = NULL ;
11911183 if (addrobj ) {
1184+ a = (struct sockaddr_in * )addr ;
11921185 ret = Py_BuildValue ("Oi" , addrobj , ntohs (a -> sin_port ));
11931186 Py_DECREF (addrobj );
11941187 }
@@ -1232,10 +1225,11 @@ makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
12321225#ifdef ENABLE_IPV6
12331226 case AF_INET6 :
12341227 {
1235- const struct sockaddr_in6 * a = ( const struct sockaddr_in6 * ) addr ;
1236- PyObject * addrobj = make_ipv6_addr ( a );
1228+ struct sockaddr_in6 * a ;
1229+ PyObject * addrobj = makeipaddr ( addr , sizeof ( * a ) );
12371230 PyObject * ret = NULL ;
12381231 if (addrobj ) {
1232+ a = (struct sockaddr_in6 * )addr ;
12391233 ret = Py_BuildValue ("OiII" ,
12401234 addrobj ,
12411235 ntohs (a -> sin6_port ),
@@ -5042,14 +5036,14 @@ static PyObject *
50425036socket_gethostbyname (PyObject * self , PyObject * args )
50435037{
50445038 char * name ;
5045- struct sockaddr_in addrbuf ;
5039+ sock_addr_t addrbuf ;
50465040 PyObject * ret = NULL ;
50475041
50485042 if (!PyArg_ParseTuple (args , "et:gethostbyname" , "idna" , & name ))
50495043 return NULL ;
5050- if (setipaddr (name , ( struct sockaddr * ) & addrbuf , sizeof (addrbuf ), AF_INET ) < 0 )
5044+ if (setipaddr (name , SAS2SA ( & addrbuf ) , sizeof (addrbuf ), AF_INET ) < 0 )
50515045 goto finally ;
5052- ret = make_ipv4_addr ( & addrbuf );
5046+ ret = makeipaddr ( SAS2SA ( & addrbuf ), sizeof ( struct sockaddr_in ) );
50535047finally :
50545048 PyMem_Free (name );
50555049 return ret ;
@@ -5151,7 +5145,7 @@ gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
51515145 sin .sin_len = sizeof (sin );
51525146#endif
51535147 memcpy (& sin .sin_addr , * pch , sizeof (sin .sin_addr ));
5154- tmp = make_ipv4_addr ( & sin );
5148+ tmp = makeipaddr (( struct sockaddr * ) & sin , sizeof ( sin ) );
51555149
51565150 if (pch == h -> h_addr_list && alen >= sizeof (sin ))
51575151 memcpy ((char * ) addr , & sin , sizeof (sin ));
@@ -5168,7 +5162,8 @@ gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
51685162 sin6 .sin6_len = sizeof (sin6 );
51695163#endif
51705164 memcpy (& sin6 .sin6_addr , * pch , sizeof (sin6 .sin6_addr ));
5171- tmp = make_ipv6_addr (& sin6 );
5165+ tmp = makeipaddr ((struct sockaddr * )& sin6 ,
5166+ sizeof (sin6 ));
51725167
51735168 if (pch == h -> h_addr_list && alen >= sizeof (sin6 ))
51745169 memcpy ((char * ) addr , & sin6 , sizeof (sin6 ));
@@ -5939,11 +5934,14 @@ socket_inet_ntop(PyObject *self, PyObject *args)
59395934 Py_buffer packed_ip ;
59405935 const char * retval ;
59415936#ifdef ENABLE_IPV6
5942- char ip [Py_MAX (INET_ADDRSTRLEN , INET6_ADDRSTRLEN )];
5937+ char ip [Py_MAX (INET_ADDRSTRLEN , INET6_ADDRSTRLEN ) + 1 ];
59435938#else
5944- char ip [INET_ADDRSTRLEN ];
5939+ char ip [INET_ADDRSTRLEN + 1 ];
59455940#endif
59465941
5942+ /* Guarantee NUL-termination for PyUnicode_FromString() below */
5943+ memset ((void * ) & ip [0 ], '\0' , sizeof (ip ));
5944+
59475945 if (!PyArg_ParseTuple (args , "iy*:inet_ntop" , & af , & packed_ip )) {
59485946 return NULL ;
59495947 }
@@ -5971,7 +5969,6 @@ socket_inet_ntop(PyObject *self, PyObject *args)
59715969 return NULL ;
59725970 }
59735971
5974- /* inet_ntop guarantee NUL-termination of resulting string. */
59755972 retval = inet_ntop (af , packed_ip .buf , ip , sizeof (ip ));
59765973 PyBuffer_Release (& packed_ip );
59775974 if (!retval ) {
0 commit comments