diff options
author | Vitaly Lavrov <vel21ripn@gmail.com> | 2017-10-03 16:43:23 +0300 |
---|---|---|
committer | Vitaly Lavrov <vel21ripn@gmail.com> | 2017-10-03 16:43:23 +0300 |
commit | 25a4569e672ad47946be1bb8b836576b5ba47693 (patch) | |
tree | e0e6128702f34bce53e2482f29659dfd5a281040 /src/lib/third_party | |
parent | 82c244b04f06aa336cb521f68d2ecb010c3a4780 (diff) |
Fix undefined behavior (detected by gcc):
ndpi_define.h.in:218: Macros NDPI_SET(), NDPI_CLR(), NDPI_ISSET()
runtime error: left shift of 1 by 31 places cannot be represented in type 'int'
http.c:364: strncpy((char*)flow->protos.http.nat_ip,(char*)packet->forwarded_line.ptr,len);
runtime error: null pointer passed as argument 2, which is declared to never be null
ndpi_patricia.c:ndpi_comp_with_mask(): int m = ((-1) << (8 - (mask % 8)));
runtime error: left shift of negative value -1
Original function ndpi_comp_with_mask() is unreadable and slow.
We have only 2 type of address: 32 bit and 128 bit. The optimized version works 6 times faster (IPv4).
Diffstat (limited to 'src/lib/third_party')
-rw-r--r-- | src/lib/third_party/src/ndpi_patricia.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/src/lib/third_party/src/ndpi_patricia.c b/src/lib/third_party/src/ndpi_patricia.c index b37fffa97..fe63b21b1 100644 --- a/src/lib/third_party/src/ndpi_patricia.c +++ b/src/lib/third_party/src/ndpi_patricia.c @@ -74,14 +74,14 @@ ndpi_prefix_tochar (prefix_t * prefix) } int ndpi_comp_with_mask (void *addr, void *dest, u_int mask) { - if( /* mask/8 == 0 || */ memcmp (addr, dest, mask / 8) == 0) { - int n = mask / 8; - int m = ((-1) << (8 - (mask % 8))); - - if(mask % 8 == 0 || (((u_char *)addr)[n] & m) == (((u_char *)dest)[n] & m)) - return (1); - } - return (0); + uint32_t *pa = addr; + uint32_t *pd = dest; + uint32_t m; + for(;mask >= 32; mask -= 32, pa++,pd++) + if(*pa != *pd) return 0; + if(!mask) return 1; + m = htonl((~0u) << (32-mask)); + return (*pa & m) == (*pd &m); } /* this allows incomplete prefix */ |