diff options
author | Gerald Combs <gerald@wireshark.org> | 2018-03-08 13:31:23 -0800 |
---|---|---|
committer | Gerald Combs <gerald@wireshark.org> | 2018-03-08 22:25:59 +0000 |
commit | 5f35b041c2d731297cdd4d780d029743fd49b9b4 (patch) | |
tree | bcdf9fd7e4753a2e2cbe303c1f6538f39fd3baa7 /epan/maxmind_db.c | |
parent | dbfd53cd60ed9f748b25a293a36893ee828f89d4 (diff) |
MaxMind DB fixups.
Make sure the text we read is null terminated. Properly strip our lines
and chunked strings. Copy over cast and strtod fixes from change 26347.
Change-Id: I0695e35c446c1bd277c53b458b07e428cdd90fb8
Reviewed-on: https://code.wireshark.org/review/26370
Petri-Dish: Gerald Combs <gerald@wireshark.org>
Tested-by: Petri Dish Buildbot
Reviewed-by: Gerald Combs <gerald@wireshark.org>
Diffstat (limited to 'epan/maxmind_db.c')
-rw-r--r-- | epan/maxmind_db.c | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/epan/maxmind_db.c b/epan/maxmind_db.c index 97b1f7fb59..6ca8ad5dc6 100644 --- a/epan/maxmind_db.c +++ b/epan/maxmind_db.c @@ -102,12 +102,12 @@ static void mmdb_resolve_stop(void); // Interned strings, similar to GLib's string chunks. static const char *chunkify_string(char *key) { - g_strstrip(key); + key = g_strstrip(key); char *chunk_string = (char *) wmem_map_lookup(mmdb_str_chunk, key); if (!chunk_string) { chunk_string = wmem_strdup(wmem_epan_scope(), key); - wmem_map_insert(mmdb_str_chunk, key, chunk_string); + wmem_map_insert(mmdb_str_chunk, chunk_string, chunk_string); } return chunk_string; @@ -116,8 +116,8 @@ static const char *chunkify_string(char *key) { static gboolean process_mmdbr_stdout(int fd) { - size_t read_buf_size = 65536; - char *read_buf = (char *) g_malloc((gsize) read_buf_size); + int read_buf_size = 131072; // Hopefully this is enough. + char *read_buf = (char *) g_malloc(read_buf_size + 1); gboolean new_entries = FALSE; MMDB_DEBUG("start %d", ws_pipe_data_available(fd)); @@ -130,16 +130,19 @@ process_mmdbr_stdout(int fd) { mmdb_resolve_stop(); break; } + read_buf[read_status] = '\0'; size_t read_len = strlen(read_buf); - MMDB_DEBUG("read %zd bytes", read_len); + MMDB_DEBUG("read %zd bytes, len %zd", read_status, read_len); if (read_len < 1) { break; } + // Split on \n and strip leading and trailing whitespace, including \r. char **lines = g_strsplit(read_buf, "\n", -1); for (size_t idx = 0; lines[idx]; idx++) { char *line = lines[idx]; + line = g_strstrip(line); size_t line_len = strlen(line); char *val_start = strchr(line, ':'); @@ -172,10 +175,10 @@ process_mmdbr_stdout(int fd) { cur_lookup.as_number = (unsigned int) strtoul(val_start, NULL, 10); } else if (g_str_has_prefix(line, RES_LOCATION_LATITUDE)) { cur_lookup.found = TRUE; - cur_lookup.latitude = strtod(val_start, NULL); + cur_lookup.latitude = g_ascii_strtod(val_start, NULL); } else if (g_str_has_prefix(line, RES_LOCATION_LONGITUDE)) { cur_lookup.found = TRUE; - cur_lookup.longitude = strtod(val_start, NULL); + cur_lookup.longitude = g_ascii_strtod(val_start, NULL); } else if (g_str_has_prefix(line, RES_END)) { if (cur_lookup.found) { mmdb_lookup_t *mmdb_val = (mmdb_lookup_t *) wmem_memdup(wmem_epan_scope(), &cur_lookup, sizeof(cur_lookup)); @@ -406,7 +409,7 @@ maxmind_db_lookup_ipv4(guint32 addr) { ws_inet_ntop4(&addr, addr_str, WS_INET_ADDRSTRLEN); MMDB_DEBUG("looking up %s", addr_str); g_strlcat(addr_str, "\n", (gsize) sizeof(addr_str)); - ssize_t write_status = ws_write(mmdbr_pipe.stdin_fd, addr_str, strlen(addr_str)); + ssize_t write_status = ws_write(mmdbr_pipe.stdin_fd, addr_str, (unsigned int)strlen(addr_str)); if (write_status < 0) { MMDB_DEBUG("write error %s", g_strerror(errno)); mmdb_resolve_stop(); @@ -430,7 +433,7 @@ maxmind_db_lookup_ipv6(const ws_in6_addr *addr) { ws_inet_ntop6(addr, addr_str, WS_INET6_ADDRSTRLEN); MMDB_DEBUG("looking up %s", addr_str); g_strlcat(addr_str, "\n", (gsize) sizeof(addr_str)); - ssize_t write_status = ws_write(mmdbr_pipe.stdin_fd, addr_str, strlen(addr_str)); + ssize_t write_status = ws_write(mmdbr_pipe.stdin_fd, addr_str, (unsigned int)strlen(addr_str)); if (write_status < 0) { MMDB_DEBUG("write error %s", g_strerror(errno)); mmdb_resolve_stop(); |