]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
util-byte: fix usage of util-byte integer parsers
authorJason Ish <jason.ish@oisf.net>
Mon, 21 Jul 2025 20:48:14 +0000 (14:48 -0600)
committerJason Ish <jason.ish@oisf.net>
Fri, 1 Aug 2025 16:54:17 +0000 (10:54 -0600)
Functions like ByteExtractStringUint8 return 0 or less on
failure. Many usages of this function treat 0 as successful as its our
common pattern.

Ticket: #7836

src/detect-dnp3.c
src/detect-engine-iponly.c
src/detect-fast-pattern.c
src/detect-http2.c
src/detect-id.c
src/output-json-dns.c
src/reputation.c
src/util-affinity.c
src/util-byte.c
src/util-radix4-tree.c
src/util-radix6-tree.c

index ca481dc75f125d5f6d9367e72669bb5fae683fb9..53fe9bd54285cf4d182b4c4696f23073e006946a 100644 (file)
@@ -186,7 +186,7 @@ static InspectionBuffer *GetDNP3Data(DetectEngineThreadCtx *det_ctx,
  */
 static int DetectDNP3FuncParseFunctionCode(const char *str, uint8_t *fc)
 {
-    if (StringParseUint8(fc, 10, (uint16_t)strlen(str), str) >= 0) {
+    if (StringParseUint8(fc, 10, (uint16_t)strlen(str), str) > 0) {
         return 1;
     }
 
@@ -335,11 +335,11 @@ static int DetectDNP3ObjParse(const char *str, uint8_t *group, uint8_t *var)
     *sep = '\0';
     varstr = sep + 1;
 
-    if (StringParseUint8(group, 0, (uint16_t)strlen(groupstr), groupstr) < 0) {
+    if (StringParseUint8(group, 0, (uint16_t)strlen(groupstr), groupstr) <= 0) {
         return 0;
     }
 
-    if (StringParseUint8(var, 0, (uint16_t)strlen(varstr), varstr) < 0) {
+    if (StringParseUint8(var, 0, (uint16_t)strlen(varstr), varstr) <= 0) {
         return 0;
     }
 
index f5aa6fbd94746cf300bd0403e27dab9479d9e715..b498103b388f2154614a16b10183a027ab758c87 100644 (file)
@@ -279,7 +279,7 @@ static int IPOnlyCIDRItemParseSingle(IPOnlyCIDRItem **pdd, const char *str)
                 }
 
                 uint8_t cidr;
-                if (StringParseU8RangeCheck(&cidr, 10, 0, (const char *)mask, 0, 32) < 0)
+                if (StringParseU8RangeCheck(&cidr, 10, 0, (const char *)mask, 0, 32) <= 0)
                     goto error;
 
                 dd->netmask = cidr;
index 19fdeba98adca3d5a41ccb3685c7912e01eeeac4..5aca0e376649eda0c7d9b9a5d9716c638ecc4a37 100644 (file)
@@ -319,8 +319,7 @@ static int DetectFastPatternSetup(DetectEngineCtx *de_ctx, Signature *s, const c
             goto error;
         }
         uint16_t offset;
-        if (StringParseUint16(&offset, 10, 0,
-                              (const char *)arg_substr) < 0) {
+        if (StringParseUint16(&offset, 10, 0, (const char *)arg_substr) <= 0) {
             SCLogError("Invalid fast pattern offset:"
                        " \"%s\"",
                     arg_substr);
@@ -335,8 +334,7 @@ static int DetectFastPatternSetup(DetectEngineCtx *de_ctx, Signature *s, const c
             goto error;
         }
         uint16_t length;
-        if (StringParseUint16(&length, 10, 0,
-                              (const char *)arg_substr) < 0) {
+        if (StringParseUint16(&length, 10, 0, (const char *)arg_substr) <= 0) {
             SCLogError("Invalid value for fast "
                        "pattern: \"%s\"",
                     arg_substr);
index ea65d9131c47afbcb155bf67ba9d72272a80ee29..181fdf537fa287d0f630685d6269c2c0357672e0 100644 (file)
@@ -211,7 +211,7 @@ static int DetectHTTP2frametypeMatch(DetectEngineThreadCtx *det_ctx,
 static int DetectHTTP2FuncParseFrameType(const char *str, uint8_t *ft)
 {
     // first parse numeric value
-    if (ByteExtractStringUint8(ft, 10, (uint16_t)strlen(str), str) >= 0) {
+    if (ByteExtractStringUint8(ft, 10, (uint16_t)strlen(str), str) > 0) {
         return 1;
     }
 
@@ -291,7 +291,7 @@ static int DetectHTTP2errorcodeMatch(DetectEngineThreadCtx *det_ctx,
 static int DetectHTTP2FuncParseErrorCode(const char *str, uint32_t *ec)
 {
     // first parse numeric value
-    if (ByteExtractStringUint32(ec, 10, (uint16_t)strlen(str), str) >= 0) {
+    if (ByteExtractStringUint32(ec, 10, (uint16_t)strlen(str), str) > 0) {
         return 1;
     }
 
index bd2525901b9a8d8514ea361311220e8db8d1519f..fd10300f5507ab18b9045f5c79c9ea6325edeecd 100644 (file)
@@ -156,7 +156,7 @@ static DetectIdData *DetectIdParse (const char *idstr)
     }
 
     /* ok, fill the id data */
-    if (StringParseUint16(&temp, 10, 0, (const char *)tmp_str) < 0) {
+    if (StringParseUint16(&temp, 10, 0, (const char *)tmp_str) <= 0) {
         SCLogError("invalid id option '%s'", tmp_str);
         goto error;
     }
index ec403ff853b1b9cb444db815ee17eba2b20424b5..03b6aa5ffdd0a096f057ca4fa15ea23b7af963a2 100644 (file)
@@ -571,7 +571,7 @@ static uint8_t GetDnsLogVersion(SCConfNode *conf)
     }
 
     uint8_t version;
-    if (StringParseUint8(&version, 10, 0, version_string) >= 0) {
+    if (StringParseUint8(&version, 10, 0, version_string) > 0) {
         return version;
     }
     SCLogWarning("Failed to parse EVE DNS log version of \"%s\"", version_string);
index c0077fe0b262debe976e7650a8b8e1f7c82144c7..f6750743febc1fbd58c67dee7b20fbfe3cd7ecb8 100644 (file)
@@ -298,10 +298,10 @@ static int SRepSplitLine(SRepCIDRTree *cidr_ctx, char *line, Address *ip, uint8_
         return 1;
 
     uint8_t c, v;
-    if (StringParseU8RangeCheck(&c, 10, 0, (const char *)ptrs[1], 0, SREP_MAX_CATS - 1) < 0)
+    if (StringParseU8RangeCheck(&c, 10, 0, (const char *)ptrs[1], 0, SREP_MAX_CATS - 1) <= 0)
         return -1;
 
-    if (StringParseU8RangeCheck(&v, 10, 0, (const char *)ptrs[2], 0, SREP_MAX_VAL) < 0)
+    if (StringParseU8RangeCheck(&v, 10, 0, (const char *)ptrs[2], 0, SREP_MAX_VAL) <= 0)
         return -1;
 
     if (strchr(ptrs[0], '/') != NULL) {
index 1b65226b097dae2e9503dd114bef81e3f8c7183a..8bc43a16f5c5a46df7120f63fead0f717895ea1a 100644 (file)
@@ -242,11 +242,11 @@ int BuildCpusetWithCallback(
             stop = 1;
         } else if (strchr(lnode->val, '-') != NULL) {
             char *sep = strchr(lnode->val, '-');
-            if (StringParseUint32(&a, 10, sep - lnode->val, lnode->val) < 0) {
+            if (StringParseUint32(&a, 10, sep - lnode->val, lnode->val) <= 0) {
                 SCLogError("%s: invalid cpu range (start invalid): \"%s\"", name, lnode->val);
                 return -1;
             }
-            if (StringParseUint32(&b, 10, strlen(sep) - 1, sep + 1) < 0) {
+            if (StringParseUint32(&b, 10, strlen(sep) - 1, sep + 1) <= 0) {
                 SCLogError("%s: invalid cpu range (end invalid): \"%s\"", name, lnode->val);
                 return -1;
             }
@@ -260,7 +260,7 @@ int BuildCpusetWithCallback(
                 return -1;
             }
         } else {
-            if (StringParseUint32(&a, 10, strlen(lnode->val), lnode->val) < 0) {
+            if (StringParseUint32(&a, 10, strlen(lnode->val), lnode->val) <= 0) {
                 SCLogError("%s: invalid cpu range (not an integer): \"%s\"", name, lnode->val);
                 return -1;
             }
index def6d087c44d30b0b2d7dcc093e742deb65d9e7c..a0cb18946039f67d0b294fd14175edf6aa8c6354 100644 (file)
@@ -140,6 +140,9 @@ int ByteExtractUint64(uint64_t *res, int e, uint16_t len, const uint8_t *bytes)
     return ret;
 }
 
+/**
+ * \retval Greater than 0 if successful, 0 or negative on failure.
+ */
 int ByteExtractUint32(uint32_t *res, int e, uint16_t len, const uint8_t *bytes)
 {
     uint64_t i64;
@@ -334,6 +337,9 @@ int StringParseUint32(uint32_t *res, int base, size_t len, const char *str)
     return ret;
 }
 
+/**
+ * \retval Greater than 0 if successful, 0 or negative on failure.
+ */
 int StringParseUint16(uint16_t *res, int base, size_t len, const char *str)
 {
     uint64_t i64;
@@ -358,6 +364,9 @@ int StringParseUint16(uint16_t *res, int base, size_t len, const char *str)
     return ret;
 }
 
+/**
+ * \retval Greater than 0 if successful, 0 or negative on failure.
+ */
 int StringParseUint8(uint8_t *res, int base, size_t len, const char *str)
 {
     uint64_t i64;
@@ -459,6 +468,9 @@ int StringParseU16RangeCheck(
     return ret;
 }
 
+/**
+ * \retval Greater than 0 if successful, 0 or negative on failure.
+ */
 int StringParseU8RangeCheck(
         uint8_t *res, int base, size_t len, const char *str, uint8_t min, uint8_t max)
 {
index 30031dc183b271d3b193b1471d51dc1d7430b773..942023b81df87d44c30c987c813c8d86335d691d 100644 (file)
@@ -248,7 +248,7 @@ bool SCRadix4AddKeyIPV4String(
         }
 
         uint8_t cidr;
-        if (StringParseU8RangeCheck(&cidr, 10, 0, (const char *)mask_str, 0, 32) < 0) {
+        if (StringParseU8RangeCheck(&cidr, 10, 0, (const char *)mask_str, 0, 32) <= 0) {
             sc_errno = SC_EINVAL;
             return false;
         }
index 27e917e8a13ad8965ec693a11a207375bb85ccc7..eddbd39d5332ae75b43538352656c23b1d157806 100644 (file)
@@ -281,7 +281,7 @@ bool SCRadix6AddKeyIPV6String(
         }
 
         uint8_t cidr;
-        if (StringParseU8RangeCheck(&cidr, 10, 0, (const char *)mask_str, 0, 128) < 0) {
+        if (StringParseU8RangeCheck(&cidr, 10, 0, (const char *)mask_str, 0, 128) <= 0) {
             sc_errno = SC_EINVAL;
             return false;
         }