From: Sascha Steinbiss Date: Wed, 27 Apr 2022 18:09:50 +0000 (+0200) Subject: detect: make int CIDRFromMask() work on big endian platforms X-Git-Tag: suricata-5.0.10~51 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1a641591def32779cf430bc47c41646c0239dc8d;p=thirdparty%2Fsuricata.git detect: make int CIDRFromMask() work on big endian platforms (cherry picked from commit 394356f73c026879672843fbb20b4de68a09d0ac) --- diff --git a/src/util-cidr.c b/src/util-cidr.c index 06a0c30bc2..bdab3063c2 100644 --- a/src/util-cidr.c +++ b/src/util-cidr.c @@ -31,25 +31,24 @@ */ int CIDRFromMask(uint32_t netmask) { + netmask = ntohl(netmask); if (netmask == 0) { return 0; } - int lead_1 = 0; - bool seen_0 = false; - for (int i = 0; i < 32; i++) { - if (!seen_0) { - if ((netmask & BIT_U32(i)) != 0) { - lead_1++; - } else { - seen_0 = true; - } + int p = 0; + bool seen_1 = false; + while (netmask > 0) { + if (netmask & 1) { + seen_1 = true; + p++; } else { - if ((netmask & BIT_U32(i)) != 0) { + if (seen_1) { return -1; } } + netmask >>= 1; } - return lead_1; + return p; } uint32_t CIDRGet(int cidr)