Skip to content

Commit 7b1cf0e

Browse files
authored
Merge pull request #2890 from martinhsv/v3/master
Fix: possible segfault on startup if duplicate ip+CIDR in ip match list
2 parents 49281b6 + 264dd48 commit 7b1cf0e

File tree

2 files changed

+12
-7
lines changed

2 files changed

+12
-7
lines changed

CHANGES

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
v3.x.y - YYYY-MMM-DD (to be released)
22
-------------------------------------
33

4+
- Fix: possible segfault on reload if duplicate ip+CIDR in ip match list
5+
[Issue #2877, #2890 - @tomsommer, @martinhsv]
46
- Add some member variable inits in Transaction class
57
[Issue #2886 - @GNU-Plus-Windows-User, @airween, @mdounin, @martinhsv]
68
- Resolve memory leak on reload (bison-generated variable)

src/utils/msc_tree.cc

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,7 @@ int InsertNetmask(TreeNode *node, TreeNode *parent, TreeNode *new_node,
259259

260260
node->count++;
261261
node->netmasks = reinterpret_cast<unsigned char *>(malloc(node->count * sizeof(unsigned char)));
262+
memset(node->netmasks, 0, (node->count * sizeof(unsigned char)));
262263

263264
if(node->netmasks == NULL)
264265
return 0;
@@ -410,6 +411,7 @@ TreeNode *CPTAddElement(unsigned char *ipdata, unsigned int ip_bitmask, CPTTree
410411
node->count++;
411412
new_node = node;
412413
node->netmasks = reinterpret_cast<unsigned char *>(malloc(node->count * sizeof(unsigned char)));
414+
memset(node->netmasks, 0, (node->count * sizeof(unsigned char)));
413415

414416
if ((node->count -1) == 0) {
415417
node->netmasks[0] = netmask;
@@ -418,16 +420,16 @@ TreeNode *CPTAddElement(unsigned char *ipdata, unsigned int ip_bitmask, CPTTree
418420

419421
node->netmasks[node->count - 1] = netmask;
420422

421-
i = node->count - 2;
422-
while (i >= 0) {
423-
if (netmask < node->netmasks[i]) {
424-
node->netmasks[i + 1] = netmask;
423+
int index = node->count - 2;
424+
while (index >= 0) {
425+
if (netmask < node->netmasks[index]) {
426+
node->netmasks[index + 1] = netmask;
425427
break;
426428
}
427429

428-
node->netmasks[i + 1] = node->netmasks[i];
429-
node->netmasks[i] = netmask;
430-
i--;
430+
node->netmasks[index + 1] = node->netmasks[index];
431+
node->netmasks[index] = netmask;
432+
index--;
431433
}
432434
}
433435
} else {
@@ -481,6 +483,7 @@ TreeNode *CPTAddElement(unsigned char *ipdata, unsigned int ip_bitmask, CPTTree
481483
}
482484

483485
i_node->netmasks = reinterpret_cast<unsigned char *>(malloc((node->count - i) * sizeof(unsigned char)));
486+
memset(i_node->netmasks, 0, ((node->count - i) * sizeof(unsigned char)));
484487

485488
if(i_node->netmasks == NULL) {
486489
free(new_node->prefix);

0 commit comments

Comments
 (0)