@@ -1094,25 +1094,33 @@ setipaddr(const char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int
10941094}
10951095
10961096
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). */
1097+ /* Convert IPv4 sockaddr to a Python str. */
11001098
11011099static PyObject *
1102- makeipaddr ( struct sockaddr * addr , int addrlen )
1100+ make_ipv4_addr ( const struct sockaddr_in * addr )
11031101{
1104- char buf [NI_MAXHOST ];
1105- int error ;
1106-
1107- error = getnameinfo (addr , addrlen , buf , sizeof (buf ), NULL , 0 ,
1108- NI_NUMERICHOST );
1109- if (error ) {
1110- set_gaierror (error );
1102+ char buf [INET_ADDRSTRLEN ];
1103+ if (inet_ntop (AF_INET , & addr -> sin_addr , buf , sizeof (buf )) == NULL ) {
1104+ PyErr_SetFromErrno (PyExc_OSError );
11111105 return NULL ;
11121106 }
11131107 return PyUnicode_FromString (buf );
11141108}
11151109
1110+ #ifdef ENABLE_IPV6
1111+ /* Convert IPv6 sockaddr to a Python str. */
1112+
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 );
1119+ return NULL ;
1120+ }
1121+ return PyUnicode_FromString (buf );
1122+ }
1123+ #endif
11161124
11171125#ifdef USE_BLUETOOTH
11181126/* Convert a string representation of a Bluetooth address into a numeric
@@ -1177,11 +1185,10 @@ makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
11771185
11781186 case AF_INET :
11791187 {
1180- struct sockaddr_in * a ;
1181- PyObject * addrobj = makeipaddr ( addr , sizeof ( * a ) );
1188+ const struct sockaddr_in * a = ( const struct sockaddr_in * ) addr ;
1189+ PyObject * addrobj = make_ipv4_addr ( a );
11821190 PyObject * ret = NULL ;
11831191 if (addrobj ) {
1184- a = (struct sockaddr_in * )addr ;
11851192 ret = Py_BuildValue ("Oi" , addrobj , ntohs (a -> sin_port ));
11861193 Py_DECREF (addrobj );
11871194 }
@@ -1225,11 +1232,10 @@ makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
12251232#ifdef ENABLE_IPV6
12261233 case AF_INET6 :
12271234 {
1228- struct sockaddr_in6 * a ;
1229- PyObject * addrobj = makeipaddr ( addr , sizeof ( * a ) );
1235+ const struct sockaddr_in6 * a = ( const struct sockaddr_in6 * ) addr ;
1236+ PyObject * addrobj = make_ipv6_addr ( a );
12301237 PyObject * ret = NULL ;
12311238 if (addrobj ) {
1232- a = (struct sockaddr_in6 * )addr ;
12331239 ret = Py_BuildValue ("OiII" ,
12341240 addrobj ,
12351241 ntohs (a -> sin6_port ),
@@ -5036,14 +5042,14 @@ static PyObject *
50365042socket_gethostbyname (PyObject * self , PyObject * args )
50375043{
50385044 char * name ;
5039- sock_addr_t addrbuf ;
5045+ struct sockaddr_in addrbuf ;
50405046 PyObject * ret = NULL ;
50415047
50425048 if (!PyArg_ParseTuple (args , "et:gethostbyname" , "idna" , & name ))
50435049 return NULL ;
5044- if (setipaddr (name , SAS2SA ( & addrbuf ) , sizeof (addrbuf ), AF_INET ) < 0 )
5050+ if (setipaddr (name , ( struct sockaddr * ) & addrbuf , sizeof (addrbuf ), AF_INET ) < 0 )
50455051 goto finally ;
5046- ret = makeipaddr ( SAS2SA ( & addrbuf ), sizeof ( struct sockaddr_in ) );
5052+ ret = make_ipv4_addr ( & addrbuf );
50475053finally :
50485054 PyMem_Free (name );
50495055 return ret ;
@@ -5145,7 +5151,7 @@ gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
51455151 sin .sin_len = sizeof (sin );
51465152#endif
51475153 memcpy (& sin .sin_addr , * pch , sizeof (sin .sin_addr ));
5148- tmp = makeipaddr (( struct sockaddr * ) & sin , sizeof ( sin ) );
5154+ tmp = make_ipv4_addr ( & sin );
51495155
51505156 if (pch == h -> h_addr_list && alen >= sizeof (sin ))
51515157 memcpy ((char * ) addr , & sin , sizeof (sin ));
@@ -5162,8 +5168,7 @@ gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
51625168 sin6 .sin6_len = sizeof (sin6 );
51635169#endif
51645170 memcpy (& sin6 .sin6_addr , * pch , sizeof (sin6 .sin6_addr ));
5165- tmp = makeipaddr ((struct sockaddr * )& sin6 ,
5166- sizeof (sin6 ));
5171+ tmp = make_ipv6_addr (& sin6 );
51675172
51685173 if (pch == h -> h_addr_list && alen >= sizeof (sin6 ))
51695174 memcpy ((char * ) addr , & sin6 , sizeof (sin6 ));
@@ -5934,14 +5939,11 @@ socket_inet_ntop(PyObject *self, PyObject *args)
59345939 Py_buffer packed_ip ;
59355940 const char * retval ;
59365941#ifdef ENABLE_IPV6
5937- char ip [Py_MAX (INET_ADDRSTRLEN , INET6_ADDRSTRLEN ) + 1 ];
5942+ char ip [Py_MAX (INET_ADDRSTRLEN , INET6_ADDRSTRLEN )];
59385943#else
5939- char ip [INET_ADDRSTRLEN + 1 ];
5944+ char ip [INET_ADDRSTRLEN ];
59405945#endif
59415946
5942- /* Guarantee NUL-termination for PyUnicode_FromString() below */
5943- memset ((void * ) & ip [0 ], '\0' , sizeof (ip ));
5944-
59455947 if (!PyArg_ParseTuple (args , "iy*:inet_ntop" , & af , & packed_ip )) {
59465948 return NULL ;
59475949 }
@@ -5969,6 +5971,7 @@ socket_inet_ntop(PyObject *self, PyObject *args)
59695971 return NULL ;
59705972 }
59715973
5974+ /* inet_ntop guarantee NUL-termination of resulting string. */
59725975 retval = inet_ntop (af , packed_ip .buf , ip , sizeof (ip ));
59735976 PyBuffer_Release (& packed_ip );
59745977 if (!retval ) {
0 commit comments