Skip to content

Commit 73a14b8

Browse files
committed
Get rid of unnecessary allocation
1 parent 2beeae4 commit 73a14b8

File tree

1 file changed

+11
-17
lines changed

1 file changed

+11
-17
lines changed

extension/maxminddb.c

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ static PyObject *from_entry_data_list(MMDB_entry_data_list_s **entry_data_list);
3636
static PyObject *from_map(MMDB_entry_data_list_s **entry_data_list);
3737
static PyObject *from_array(MMDB_entry_data_list_s **entry_data_list);
3838
static 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

Comments
 (0)