@@ -31,7 +31,7 @@ typedef struct {
3131 PyObject * record_size ;
3232} Metadata_obj ;
3333
34- static char * format_sockaddr (struct sockaddr * addr );
34+ static bool format_sockaddr (struct sockaddr * addr , char * dst );
3535static PyObject * from_entry_data_list (MMDB_entry_data_list_s * * entry_data_list );
3636static PyObject * from_map (MMDB_entry_data_list_s * * entry_data_list );
3737static PyObject * from_array (MMDB_entry_data_list_s * * entry_data_list );
@@ -142,10 +142,11 @@ static PyObject *Reader_get(PyObject *self, PyObject *args)
142142 } else {
143143 exception = MaxMindDB_error ;
144144 }
145- char * ipstr = format_sockaddr (ip_address );
146- PyErr_Format (exception , "Error looking up %s. %s" ,
147- ipstr , MMDB_strerror (mmdb_error ));
148- free (ipstr );
145+ char ipstr [INET6_ADDRSTRLEN ] = { 0 };
146+ if (format_sockaddr (ip_address , ipstr )) {
147+ PyErr_Format (exception , "Error looking up %s. %s" ,
148+ ipstr , MMDB_strerror (mmdb_error ));
149+ }
149150 return NULL ;
150151 }
151152
@@ -156,11 +157,12 @@ static PyObject *Reader_get(PyObject *self, PyObject *args)
156157 MMDB_entry_data_list_s * entry_data_list = NULL ;
157158 int status = MMDB_get_entry_data_list (& result .entry , & entry_data_list );
158159 if (MMDB_SUCCESS != status ) {
159- char * ipstr = format_sockaddr (ip_address );
160- PyErr_Format (MaxMindDB_error ,
161- "Error while looking up data for %s. %s" ,
162- ipstr , MMDB_strerror (status ));
163- free (ipstr );
160+ char ipstr [INET6_ADDRSTRLEN ] = { 0 };
161+ if (format_sockaddr (ip_address , ipstr )) {
162+ PyErr_Format (MaxMindDB_error ,
163+ "Error while looking up data for %s. %s" ,
164+ ipstr , MMDB_strerror (status ));
165+ }
164166 MMDB_free_entry_data_list (entry_data_list );
165167 return NULL ;
166168 }
@@ -253,10 +255,8 @@ static int ip_converter(PyObject *obj, struct sockaddr_storage *ip_address)
253255 }
254256}
255257
256- static char * format_sockaddr (struct sockaddr * sa )
258+ static bool format_sockaddr (struct sockaddr * sa , char * dst )
257259{
258- char * ip = calloc (INET6_ADDRSTRLEN , sizeof (char ));
259-
260260 char * addr ;
261261 if (sa -> sa_family == AF_INET ) {
262262 struct sockaddr_in * sin = (struct sockaddr_in * )sa ;
@@ -266,8 +266,12 @@ static char *format_sockaddr(struct sockaddr *sa)
266266 addr = (char * )& sin -> sin6_addr ;
267267 }
268268
269- inet_ntop (sa -> sa_family , addr , ip , INET6_ADDRSTRLEN );
270- return ip ;
269+ if (inet_ntop (sa -> sa_family , addr , dst , INET6_ADDRSTRLEN )) {
270+ return true;
271+ }
272+ PyErr_SetString (PyExc_RuntimeError ,
273+ "unable to format IP address" );
274+ return false;
271275}
272276
273277
0 commit comments