summaryrefslogtreecommitdiffstats
path: root/main/libmaxminddb/0001-avoid-unneeded-memory-allocations.patch
blob: 3126a5603645546fbdcc8fe09c54e40cce88dfbc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
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