Skip to content

Commit 20c70e7

Browse files
committed
permissions: Reduce memory allocation
1 parent accc232 commit 20c70e7

File tree

2 files changed

+42
-37
lines changed

2 files changed

+42
-37
lines changed

modules/permissions/hash.c

Lines changed: 41 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -39,57 +39,62 @@ unsigned int address_node_hash(pht_hash_table_t *table, void *node) {
3939

4040
address = node;
4141

42-
str_ip.len = address->k.subnet->ip.len;
43-
str_ip.s = (char *)address->k.subnet->ip.u.addr;
42+
str_ip.len = address->k.subnet.ip.len;
43+
str_ip.s = (char *)address->k.subnet.ip.u.addr;
4444

4545
return address_hash(table, &str_ip);
4646
}
4747

4848
void delete_address_node(p_address_node_t *node) {
49-
if (node) {
50-
if (node->k.subnet) shm_free(node->k.subnet);
51-
if (node->v.pattern) shm_free(node->v.pattern);
52-
if (node->v.info) shm_free(node->v.info);
53-
shm_free(node);
54-
}
49+
if (node) shm_free(node);
5550
}
5651

57-
char *str_dup(str *src) {
58-
char *dest = NULL;
59-
if (src->len) {
60-
dest = shm_malloc(src->len + 1);
61-
if (!dest) return NULL;
62-
memcpy(dest, src->s, src->len);
63-
dest[src->len] = '\0';
64-
}
65-
return dest;
52+
p_address_node_t *alloc_address_node(str *pattern, str *info) {
53+
int total_size, pattern_len, info_len;
54+
char *offset;
55+
p_address_node_t *node;
56+
57+
pattern_len = pattern->len > 0 ? pattern->len + 1 : 0;
58+
info_len = (info->len > 0 ? info->len + 1 : 0);
59+
60+
total_size = sizeof(p_address_node_t) + pattern_len + info_len;
61+
offset = shm_malloc(total_size);
62+
if (!offset) return NULL;
63+
64+
node = (p_address_node_t *)offset;
65+
66+
offset += sizeof(p_address_node_t);
67+
node->v.pattern = pattern_len > 0 ? offset : NULL;
68+
69+
offset += pattern_len;
70+
node->v.info = info_len > 0 ? offset : NULL;
71+
72+
return node;
6673
}
6774

6875
p_address_node_t *new_address_node(struct net *subnet, unsigned int port, int proto, str *pattern,
6976
str *info) {
7077
p_address_node_t *node;
7178

72-
node = shm_malloc(sizeof(p_address_node_t));
79+
node = alloc_address_node(pattern, info);
7380
if (!node) return NULL;
7481

7582
node->v.port = port;
7683
node->v.proto = proto;
7784

78-
node->k.subnet = shm_malloc(sizeof(struct net));
79-
if (!node->k.subnet) goto err;
80-
memcpy(node->k.subnet, subnet, sizeof(struct net));
85+
memcpy(&node->k.subnet, subnet, sizeof(struct net));
8186

82-
node->v.pattern = str_dup(pattern);
83-
if (pattern->len && !node->v.pattern) goto err;
87+
if (pattern->len > 0) {
88+
memcpy(node->v.pattern, pattern->s, pattern->len);
89+
node->v.pattern[pattern->len] = '\0';
90+
}
8491

85-
node->v.info = str_dup(info);
86-
if (info->len && !node->v.info) goto err;
92+
if (info->len > 0) {
93+
memcpy(node->v.info, info->s, info->len);
94+
node->v.info[info->len] = '\0';
95+
}
8796

8897
return node;
89-
90-
err:
91-
delete_address_node(node);
92-
return NULL;
9398
}
9499

95100
void delete_group_node(p_group_node_t *group) {
@@ -227,7 +232,7 @@ int match_address(p_address_node_t *address, struct ip_addr *ip, unsigned int po
227232

228233
if ((address->v.proto == PROTO_NONE || address->v.proto == proto || proto == PROTO_NONE) &&
229234
(address->v.port == PORT_ANY || address->v.port == port || port == PORT_ANY) &&
230-
(ip_addr_cmp(ip, &address->k.subnet->ip) || matchnet(ip, address->k.subnet))) {
235+
(ip_addr_cmp(ip, &address->k.subnet.ip) || matchnet(ip, &address->k.subnet))) {
231236
if (!address->v.pattern || !pattern) {
232237
LM_DBG("no pattern to match\n");
233238
return 1;
@@ -336,7 +341,7 @@ int pm_hash_find_group(p_address_table_t *table, struct ip_addr *ip, unsigned in
336341
for (address = group->v.address.bucket[address_hash(&group->v.address, &str_ip)]; address;
337342
address = address->next) {
338343
if ((address->v.port == PORT_ANY || address->v.port == port || port == PORT_ANY) &&
339-
(ip_addr_cmp(ip, &address->k.subnet->ip) || matchnet(ip, address->k.subnet))) {
344+
(ip_addr_cmp(ip, &address->k.subnet.ip) || matchnet(ip, &address->k.subnet))) {
340345
return group->k.group;
341346
}
342347
}
@@ -363,13 +368,13 @@ int pm_hash_mi_print(p_address_table_t *table, mi_item_t *part_item, struct pm_p
363368
for (group = table->group; group; group = group->next) {
364369
for (i = 0; i < group->v.address.bucket_count; ++i) {
365370
for (address = group->v.address.bucket[i]; address; address = address->next) {
366-
mask = ip_addr2a(&address->k.subnet->mask);
371+
mask = ip_addr2a(&address->k.subnet.mask);
367372
if (!mask) {
368373
LM_ERR("cannot print mask address\n");
369374
continue;
370375
}
371-
if (memcmp(&address->k.subnet->mask.u, ipv6_mask_128,
372-
address->k.subnet->mask.len) == 0) {
376+
if (memcmp(&address->k.subnet.mask.u, ipv6_mask_128, address->k.subnet.mask.len) ==
377+
0) {
373378
if (is_subnet) continue;
374379
is_address = 1;
375380
} else {
@@ -382,11 +387,11 @@ int pm_hash_mi_print(p_address_table_t *table, mi_item_t *part_item, struct pm_p
382387

383388
if (add_mi_number(dest_item, MI_SSTR("grp"), group->k.group) < 0) return -1;
384389

385-
p = ip_addr2a(&address->k.subnet->ip);
390+
p = ip_addr2a(&address->k.subnet.ip);
386391
if (add_mi_string(dest_item, MI_SSTR("ip"), p, strlen(p)) < 0) return -1;
387392

388393
if (is_address) {
389-
if (address->k.subnet->ip.af == AF_INET) {
394+
if (address->k.subnet.ip.af == AF_INET) {
390395
if (add_mi_string(dest_item, MI_SSTR("mask"), MI_SSTR("32")) < 0) return -1;
391396
} else {
392397
if (add_mi_string(dest_item, MI_SSTR("mask"), MI_SSTR("128")) < 0)

modules/permissions/hash.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ typedef struct p_address_node_t {
5252
p_address_node_t *next;
5353

5454
struct {
55-
struct net *subnet;
55+
struct net subnet;
5656
} k;
5757
struct {
5858
unsigned int port;

0 commit comments

Comments
 (0)