@@ -1099,25 +1099,33 @@ setipaddr(const char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int
10991099}
11001100
11011101
1102- /* Create a string object representing an IP address.
1103- This is always a string of the form 'dd.dd.dd.dd' (with variable
1104- size numbers). */
1102+ /* Convert IPv4 sockaddr to a Python str. */
11051103
11061104static PyObject *
1107- makeipaddr ( struct sockaddr * addr , int addrlen )
1105+ make_ipv4_addr ( const struct sockaddr_in * addr )
11081106{
1109- char buf [NI_MAXHOST ];
1110- int error ;
1111-
1112- error = getnameinfo (addr , addrlen , buf , sizeof (buf ), NULL , 0 ,
1113- NI_NUMERICHOST );
1114- if (error ) {
1115- set_gaierror (error );
1107+ char buf [INET_ADDRSTRLEN ];
1108+ if (inet_ntop (AF_INET , & addr -> sin_addr , buf , sizeof (buf )) == NULL ) {
1109+ PyErr_SetFromErrno (PyExc_OSError );
11161110 return NULL ;
11171111 }
11181112 return PyUnicode_FromString (buf );
11191113}
11201114
1115+ #ifdef ENABLE_IPV6
1116+ /* Convert IPv6 sockaddr to a Python str. */
1117+
1118+ static PyObject *
1119+ make_ipv6_addr (const struct sockaddr_in6 * addr )
1120+ {
1121+ char buf [INET6_ADDRSTRLEN ];
1122+ if (inet_ntop (AF_INET6 , & addr -> sin6_addr , buf , sizeof (buf )) == NULL ) {
1123+ PyErr_SetFromErrno (PyExc_OSError );
1124+ return NULL ;
1125+ }
1126+ return PyUnicode_FromString (buf );
1127+ }
1128+ #endif
11211129
11221130#ifdef USE_BLUETOOTH
11231131/* Convert a string representation of a Bluetooth address into a numeric
@@ -1182,11 +1190,10 @@ makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
11821190
11831191 case AF_INET :
11841192 {
1185- struct sockaddr_in * a ;
1186- PyObject * addrobj = makeipaddr ( addr , sizeof ( * a ) );
1193+ const struct sockaddr_in * a = ( const struct sockaddr_in * ) addr ;
1194+ PyObject * addrobj = make_ipv4_addr ( a );
11871195 PyObject * ret = NULL ;
11881196 if (addrobj ) {
1189- a = (struct sockaddr_in * )addr ;
11901197 ret = Py_BuildValue ("Oi" , addrobj , ntohs (a -> sin_port ));
11911198 Py_DECREF (addrobj );
11921199 }
@@ -1230,11 +1237,10 @@ makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
12301237#ifdef ENABLE_IPV6
12311238 case AF_INET6 :
12321239 {
1233- struct sockaddr_in6 * a ;
1234- PyObject * addrobj = makeipaddr ( addr , sizeof ( * a ) );
1240+ const struct sockaddr_in6 * a = ( const struct sockaddr_in6 * ) addr ;
1241+ PyObject * addrobj = make_ipv6_addr ( a );
12351242 PyObject * ret = NULL ;
12361243 if (addrobj ) {
1237- a = (struct sockaddr_in6 * )addr ;
12381244 ret = Py_BuildValue ("OiII" ,
12391245 addrobj ,
12401246 ntohs (a -> sin6_port ),
@@ -5154,14 +5160,14 @@ static PyObject *
51545160socket_gethostbyname (PyObject * self , PyObject * args )
51555161{
51565162 char * name ;
5157- sock_addr_t addrbuf ;
5163+ struct sockaddr_in addrbuf ;
51585164 PyObject * ret = NULL ;
51595165
51605166 if (!PyArg_ParseTuple (args , "et:gethostbyname" , "idna" , & name ))
51615167 return NULL ;
5162- if (setipaddr (name , SAS2SA ( & addrbuf ) , sizeof (addrbuf ), AF_INET ) < 0 )
5168+ if (setipaddr (name , ( struct sockaddr * ) & addrbuf , sizeof (addrbuf ), AF_INET ) < 0 )
51635169 goto finally ;
5164- ret = makeipaddr ( SAS2SA ( & addrbuf ), sizeof ( struct sockaddr_in ) );
5170+ ret = make_ipv4_addr ( & addrbuf );
51655171finally :
51665172 PyMem_Free (name );
51675173 return ret ;
@@ -5263,7 +5269,7 @@ gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
52635269 sin .sin_len = sizeof (sin );
52645270#endif
52655271 memcpy (& sin .sin_addr , * pch , sizeof (sin .sin_addr ));
5266- tmp = makeipaddr (( struct sockaddr * ) & sin , sizeof ( sin ) );
5272+ tmp = make_ipv4_addr ( & sin );
52675273
52685274 if (pch == h -> h_addr_list && alen >= sizeof (sin ))
52695275 memcpy ((char * ) addr , & sin , sizeof (sin ));
@@ -5280,8 +5286,7 @@ gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
52805286 sin6 .sin6_len = sizeof (sin6 );
52815287#endif
52825288 memcpy (& sin6 .sin6_addr , * pch , sizeof (sin6 .sin6_addr ));
5283- tmp = makeipaddr ((struct sockaddr * )& sin6 ,
5284- sizeof (sin6 ));
5289+ tmp = make_ipv6_addr (& sin6 );
52855290
52865291 if (pch == h -> h_addr_list && alen >= sizeof (sin6 ))
52875292 memcpy ((char * ) addr , & sin6 , sizeof (sin6 ));
@@ -6052,14 +6057,11 @@ socket_inet_ntop(PyObject *self, PyObject *args)
60526057 Py_buffer packed_ip ;
60536058 const char * retval ;
60546059#ifdef ENABLE_IPV6
6055- char ip [Py_MAX (INET_ADDRSTRLEN , INET6_ADDRSTRLEN ) + 1 ];
6060+ char ip [Py_MAX (INET_ADDRSTRLEN , INET6_ADDRSTRLEN )];
60566061#else
6057- char ip [INET_ADDRSTRLEN + 1 ];
6062+ char ip [INET_ADDRSTRLEN ];
60586063#endif
60596064
6060- /* Guarantee NUL-termination for PyUnicode_FromString() below */
6061- memset ((void * ) & ip [0 ], '\0' , sizeof (ip ));
6062-
60636065 if (!PyArg_ParseTuple (args , "iy*:inet_ntop" , & af , & packed_ip )) {
60646066 return NULL ;
60656067 }
@@ -6087,6 +6089,7 @@ socket_inet_ntop(PyObject *self, PyObject *args)
60876089 return NULL ;
60886090 }
60896091
6092+ /* inet_ntop guarantee NUL-termination of resulting string. */
60906093 retval = inet_ntop (af , packed_ip .buf , ip , sizeof (ip ));
60916094 PyBuffer_Release (& packed_ip );
60926095 if (!retval ) {
0 commit comments