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
|