diff options
author | Timo Teräs <timo.teras@iki.fi> | 2013-11-14 15:33:16 +0200 |
---|---|---|
committer | Timo Teräs <timo.teras@iki.fi> | 2013-11-14 15:33:16 +0200 |
commit | 6fd658a9994c9d1d1aa3447bddc8c1a15744e766 (patch) | |
tree | 150cfd517c52015f1081c23f2fb2092cbd4dbc4c /main/libmaxminddb/0001-avoid-unneeded-memory-allocations.patch | |
parent | 3df7efd33ac16ad57c9d2c2e8cb7b29576edd6fa (diff) | |
download | aports-6fd658a9994c9d1d1aa3447bddc8c1a15744e766.tar.bz2 aports-6fd658a9994c9d1d1aa3447bddc8c1a15744e766.tar.xz |
main/libmaxminddb: new aport
Maxmind GeoIP2 database library
https://github.com/maxmind/$pkgname
Diffstat (limited to 'main/libmaxminddb/0001-avoid-unneeded-memory-allocations.patch')
-rw-r--r-- | main/libmaxminddb/0001-avoid-unneeded-memory-allocations.patch | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/main/libmaxminddb/0001-avoid-unneeded-memory-allocations.patch b/main/libmaxminddb/0001-avoid-unneeded-memory-allocations.patch new file mode 100644 index 0000000000..3126a56036 --- /dev/null +++ b/main/libmaxminddb/0001-avoid-unneeded-memory-allocations.patch @@ -0,0 +1,112 @@ +From f4e82c231bd5089db5ee8b8082489304264bc805 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Timo=20Ter=C3=A4s?= <timo.teras@iki.fi> +Date: Thu, 14 Nov 2013 14:35:18 +0200 +Subject: [PATCH 1/2] avoid unneeded memory allocations + +--- + bin/mmdblookup.c | 18 ++++++------------ + src/maxminddb.c | 14 +++++--------- + 2 files changed, 11 insertions(+), 21 deletions(-) + +diff --git a/bin/mmdblookup.c b/bin/mmdblookup.c +index ac72a93..4b7733d 100644 +--- a/bin/mmdblookup.c ++++ b/bin/mmdblookup.c +@@ -24,7 +24,7 @@ LOCAL int lookup_and_print(MMDB_s *mmdb, const char *ip_address, + int lookup_path_length); + LOCAL int benchmark(MMDB_s *mmdb, int iterations); + LOCAL MMDB_lookup_result_s lookup_or_die(MMDB_s *mmdb, const char *ipstr); +-LOCAL char *random_ipv4(); ++LOCAL void random_ipv4(char *ip); + /* --prototypes end - don't remove this comment-- */ + /* *INDENT-ON* */ + +@@ -304,13 +304,14 @@ LOCAL int lookup_and_print(MMDB_s *mmdb, const char *ip_address, + + LOCAL int benchmark(MMDB_s *mmdb, int iterations) + { ++ char ip_address[16]; + int exit_code = 0; +- srand( time(NULL) ); + ++ srand( time(NULL) ); + clock_t time = clock(); + + for (int i = 0; i < iterations; i++) { +- char *ip_address = random_ipv4(); ++ random_ipv4(ip_address); + + MMDB_lookup_result_s result = lookup_or_die(mmdb, ip_address); + MMDB_entry_data_list_s *entry_data_list = NULL; +@@ -324,13 +325,11 @@ LOCAL int benchmark(MMDB_s *mmdb, int iterations) + fprintf(stderr, "Got an error looking up the entry data - %s\n", + MMDB_strerror(status)); + exit_code = 5; +- free(ip_address); + MMDB_free_entry_data_list(entry_data_list); + goto end; + } + } + +- free(ip_address); + MMDB_free_entry_data_list(entry_data_list); + } + +@@ -369,13 +368,8 @@ LOCAL MMDB_lookup_result_s lookup_or_die(MMDB_s *mmdb, const char *ipstr) + return result; + } + +-LOCAL char *random_ipv4() ++LOCAL void random_ipv4(char *ip) + { +- int ip_int = rand(); +- uint8_t *bytes = (uint8_t *)&ip_int; +- +- char *ip = malloc(16); + snprintf(ip, 16, "%u.%u.%u.%u", +- *bytes, *(bytes + 1), *(bytes + 2), *(bytes + 3)); +- return ip; ++ rand()&0xff, rand()&0xff, rand()&0xff, rand()&0xff); + } +diff --git a/src/maxminddb.c b/src/maxminddb.c +index f3a7dfd..3bf7154 100644 +--- a/src/maxminddb.c ++++ b/src/maxminddb.c +@@ -625,20 +625,18 @@ MMDB_lookup_result_s MMDB_lookup_sockaddr(MMDB_s *mmdb, + } + }; + +- uint8_t *address; ++ uint8_t mapped_address[16], *address; + if (mmdb->metadata.ip_version == 4) { + if (sockaddr->sa_family == AF_INET6) { + return result; + } +- address = malloc(4); +- memcpy(address, &((struct sockaddr_in *)sockaddr)->sin_addr.s_addr, 4); ++ address = (uint8_t*) &((struct sockaddr_in *)sockaddr)->sin_addr.s_addr; + } else { +- // We need calloc() here for the IPv4 case - the first 12 bytes must be 0 +- address = calloc(1, 16); + if (sockaddr->sa_family == AF_INET6) { +- memcpy(address, +- ((struct sockaddr_in6 *)sockaddr)->sin6_addr.s6_addr, 16); ++ address = (uint8_t*) &((struct sockaddr_in6 *)sockaddr)->sin6_addr.s6_addr; + } else { ++ address = mapped_address; ++ memset(address, 0, 12); + memcpy(address + 12, + &((struct sockaddr_in *)sockaddr)->sin_addr.s_addr, 4); + } +@@ -648,8 +646,6 @@ MMDB_lookup_result_s MMDB_lookup_sockaddr(MMDB_s *mmdb, + find_address_in_search_tree(mmdb, address, sockaddr->sa_family, + &result); + +- free(address); +- + return result; + } + +-- +1.8.4.1 + |