Skip to content

Commit f6d66a7

Browse files
committed
Improve error handling of format_sockaddr
1 parent c161311 commit f6d66a7

File tree

1 file changed

+19
-15
lines changed

1 file changed

+19
-15
lines changed

extension/maxminddb.c

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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);
3535
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);
@@ -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

Comments
 (0)