@@ -36,7 +36,7 @@ static 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 );
3838static PyObject * from_uint128 (const MMDB_entry_data_list_s * entry_data_list );
39- static int ip_converter (PyObject * obj , struct sockaddr * * ip_address );
39+ static int ip_converter (PyObject * obj , struct sockaddr_storage * ip_address );
4040
4141#if PY_MAJOR_VERSION >= 3
4242 #define MOD_INIT (name ) PyMODINIT_FUNC PyInit_ ## name(void)
@@ -119,12 +119,13 @@ static PyObject *Reader_get(PyObject *self, PyObject *args)
119119 return NULL ;
120120 }
121121
122- struct sockaddr * ip_address = NULL ;
123- if (!PyArg_ParseTuple (args , "O&" , ip_converter , & ip_address )) {
122+ struct sockaddr_storage ip_address_ss = { 0 };
123+ struct sockaddr * ip_address = (struct sockaddr * )& ip_address_ss ;
124+ if (!PyArg_ParseTuple (args , "O&" , ip_converter , & ip_address_ss )) {
124125 return NULL ;
125126 }
126127
127- if (ip_address == NULL ) {
128+ if (! ip_address -> sa_family ) {
128129 PyErr_SetString (PyExc_ValueError ,
129130 "Error parsing argument" );
130131 return NULL ;
@@ -145,12 +146,10 @@ static PyObject *Reader_get(PyObject *self, PyObject *args)
145146 PyErr_Format (exception , "Error looking up %s. %s" ,
146147 ipstr , MMDB_strerror (mmdb_error ));
147148 free (ipstr );
148- free (ip_address );
149149 return NULL ;
150150 }
151151
152152 if (!result .found_entry ) {
153- free (ip_address );
154153 Py_RETURN_NONE ;
155154 }
156155
@@ -162,19 +161,17 @@ static PyObject *Reader_get(PyObject *self, PyObject *args)
162161 "Error while looking up data for %s. %s" ,
163162 ipstr , MMDB_strerror (status ));
164163 free (ipstr );
165- free (ip_address );
166164 MMDB_free_entry_data_list (entry_data_list );
167165 return NULL ;
168166 }
169167
170168 MMDB_entry_data_list_s * original_entry_data_list = entry_data_list ;
171169 PyObject * py_obj = from_entry_data_list (& entry_data_list );
172170 MMDB_free_entry_data_list (original_entry_data_list );
173- free (ip_address );
174171 return py_obj ;
175172}
176173
177- static int ip_converter (PyObject * obj , struct sockaddr * * ip_address )
174+ static int ip_converter (PyObject * obj , struct sockaddr_storage * ip_address )
178175{
179176#if PY_MAJOR_VERSION >= 3
180177 if (PyUnicode_Check (obj )) {
@@ -211,8 +208,7 @@ static int ip_converter(PyObject *obj, struct sockaddr **ip_address)
211208 ipstr );
212209 return 0 ;
213210 }
214- * ip_address = calloc (1 , sizeof (struct sockaddr_storage ));
215- memcpy (* ip_address , addresses -> ai_addr , addresses -> ai_addrlen );
211+ memcpy (ip_address , addresses -> ai_addr , addresses -> ai_addrlen );
216212 freeaddrinfo (addresses );
217213 return 1 ;
218214 }
@@ -229,19 +225,17 @@ static int ip_converter(PyObject *obj, struct sockaddr **ip_address)
229225 return 0 ;
230226 }
231227
232- * ip_address = calloc (1 , sizeof (struct sockaddr_storage ));
233-
234228 switch (len ) {
235229 case 16 : {
236- ( * ip_address ) -> sa_family = AF_INET6 ;
237- struct sockaddr_in6 * sin = (struct sockaddr_in6 * )* ip_address ;
230+ ip_address -> ss_family = AF_INET6 ;
231+ struct sockaddr_in6 * sin = (struct sockaddr_in6 * )ip_address ;
238232 memcpy (sin -> sin6_addr .s6_addr , bytes , len );
239233 Py_DECREF (packed );
240234 return 1 ;
241235 }
242236 case 4 : {
243- ( * ip_address ) -> sa_family = AF_INET ;
244- struct sockaddr_in * sin = (struct sockaddr_in * )* ip_address ;
237+ ip_address -> ss_family = AF_INET ;
238+ struct sockaddr_in * sin = (struct sockaddr_in * )ip_address ;
245239 memcpy (& (sin -> sin_addr .s_addr ), bytes , len );
246240 Py_DECREF (packed );
247241 return 1 ;
0 commit comments