]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
pcre2: check for PCRE2_ERROR_UNSET
authorPhilippe Antoine <contact@catenacyber.fr>
Mon, 12 Apr 2021 13:41:27 +0000 (15:41 +0200)
committerPhilippe Antoine <contact@catenacyber.fr>
Tue, 28 Sep 2021 15:46:19 +0000 (17:46 +0200)
Needs maybe to be generalized

22 files changed:
src/detect-byte-extract.c
src/detect-bytemath.c
src/detect-dsize.c
src/detect-filesize.c
src/detect-flow.c
src/detect-fragbits.c
src/detect-fragoffset.c
src/detect-icmp-id.c
src/detect-icmp-seq.c
src/detect-icode.c
src/detect-itype.c
src/detect-nfs-procedure.c
src/detect-nfs-version.c
src/detect-parse.c
src/detect-parse.h
src/detect-rfb-sectype.c
src/detect-snmp-version.c
src/detect-ssl-state.c
src/detect-tcp-flags.c
src/detect-tcp-window.c
src/detect-tls-cert-validity.c
src/detect-urilen.c

index a5a0cb329d1794bb07e4abf33f2fba423b86d8df..49f2c4bae8aa3790569d2aa8262920d31b4e4aa7 100644 (file)
@@ -284,13 +284,12 @@ static inline DetectByteExtractData *DetectByteExtractParse(DetectEngineCtx *de_
     for (i = 4; i < ret; i++) {
         char opt_str[64] = "";
         pcre2len = sizeof(opt_str);
-        res = pcre2_substring_copy_bynumber(
-                parse_regex.match, i, (PCRE2_UCHAR8 *)opt_str, &pcre2len);
+        res = SC_pcre2_substring_copy(parse_regex.match, i, (PCRE2_UCHAR8 *)opt_str, &pcre2len);
         if (res < 0) {
             SCLogError(SC_ERR_PCRE_GET_SUBSTRING,
                     "pcre2_substring_copy_bynumber failed "
-                    "for arg %d for byte_extract",
-                    i);
+                    "for arg %d for byte_extract with %d",
+                    i, res);
             goto error;
         }
 
index b7f1e28c3357a6d53b891ca2fd3faee402c3d9c5..7a46f5ebd0cb914809de392c5952c5f57e8b7a09 100644 (file)
@@ -399,7 +399,7 @@ static DetectByteMathData *DetectByteMathParse(DetectEngineCtx *de_ctx, const ch
 
     if (ret > RELATIVE_KW) {
         pcre2len = sizeof(tmp_str);
-        res = pcre2_substring_copy_bynumber(
+        res = SC_pcre2_substring_copy(
                 parse_regex.match, RELATIVE_KW, (PCRE2_UCHAR8 *)tmp_str, &pcre2len);
 
         if (res < 0) {
@@ -415,7 +415,7 @@ static DetectByteMathData *DetectByteMathParse(DetectEngineCtx *de_ctx, const ch
 
     if (ret > ENDIAN_VAL) {
         pcre2len = sizeof(tmp_str);
-        res = pcre2_substring_copy_bynumber(
+        res = SC_pcre2_substring_copy(
                 parse_regex.match, ENDIAN_KW, (PCRE2_UCHAR8 *)tmp_str, &pcre2len);
         if (res < 0) {
             SCLogError(SC_ERR_PCRE_GET_SUBSTRING, "pcre2_substring_copy_bynumber failed "
@@ -428,7 +428,7 @@ static DetectByteMathData *DetectByteMathParse(DetectEngineCtx *de_ctx, const ch
         }
 
         pcre2len = sizeof(tmp_str);
-        res = pcre2_substring_copy_bynumber(
+        res = SC_pcre2_substring_copy(
                 parse_regex.match, ENDIAN_VAL, (PCRE2_UCHAR8 *)tmp_str, &pcre2len);
         if (res < 0) {
             SCLogError(SC_ERR_PCRE_GET_SUBSTRING, "pcre2_substring_copy_bynumber failed "
@@ -445,7 +445,7 @@ static DetectByteMathData *DetectByteMathParse(DetectEngineCtx *de_ctx, const ch
 
     if (ret > STRING_VAL) {
         pcre2len = sizeof(tmp_str);
-        res = pcre2_substring_copy_bynumber(
+        res = SC_pcre2_substring_copy(
                 parse_regex.match, STRING_KW, (PCRE2_UCHAR8 *)tmp_str, &pcre2len);
         if (res < 0) {
             SCLogError(SC_ERR_PCRE_GET_SUBSTRING, "pcre2_substring_copy_bynumber failed "
@@ -458,7 +458,7 @@ static DetectByteMathData *DetectByteMathParse(DetectEngineCtx *de_ctx, const ch
         }
 
         pcre2len = sizeof(tmp_str);
-        res = pcre2_substring_copy_bynumber(
+        res = SC_pcre2_substring_copy(
                 parse_regex.match, STRING_VAL, (PCRE2_UCHAR8 *)tmp_str, &pcre2len);
         if (res < 0) {
             SCLogError(SC_ERR_PCRE_GET_SUBSTRING, "pcre2_substring_copy_bynumber failed "
@@ -478,7 +478,7 @@ static DetectByteMathData *DetectByteMathParse(DetectEngineCtx *de_ctx, const ch
 
     if (ret > DCE_KW) {
         pcre2len = sizeof(tmp_str);
-        res = pcre2_substring_copy_bynumber(
+        res = SC_pcre2_substring_copy(
                 parse_regex.match, DCE_KW, (PCRE2_UCHAR8 *)tmp_str, &pcre2len);
         if (res < 0) {
             SCLogError(SC_ERR_PCRE_GET_SUBSTRING, "pcre2_substring_copy_bynumber failed "
index 5278d68f41dc2162d881b124333c9f35da59ac21..962b98404f1cf4e6e9b65adef3578918bf12e9d8 100644 (file)
@@ -156,9 +156,9 @@ static DetectDsizeData *DetectDsizeParse (const char *rawstr)
     }
 
     pcre2len = sizeof(mode);
-    res = pcre2_substring_copy_bynumber(parse_regex.match, 1, (PCRE2_UCHAR8 *)mode, &pcre2len);
+    res = SC_pcre2_substring_copy(parse_regex.match, 1, (PCRE2_UCHAR8 *)mode, &pcre2len);
     if (res < 0) {
-        SCLogError(SC_ERR_PCRE_GET_SUBSTRING, "pcre2_substring_copy_bynumber failed");
+        SCLogError(SC_ERR_PCRE_GET_SUBSTRING, "pcre2_substring_copy_bynumber failed with %d", res);
         goto error;
     }
     SCLogDebug("mode \"%s\"", mode);
index b33ae67a0f4184b401494e8990440fc8806e76c1..87cf12793d63abcb84f5b0a8d3e2e40c625efee8 100644 (file)
@@ -158,7 +158,7 @@ static DetectFilesizeData *DetectFilesizeParse (const char *str)
 
     SCLogDebug("ret %d", ret);
 
-    res = pcre2_substring_get_bynumber(parse_regex.match, 1, (PCRE2_UCHAR8 **)&str_ptr, &pcre2_len);
+    res = SC_pcre2_substring_get(parse_regex.match, 1, (PCRE2_UCHAR8 **)&str_ptr, &pcre2_len);
     if (res < 0) {
         SCLogError(SC_ERR_PCRE_GET_SUBSTRING, "pcre2_substring_get_bynumber failed");
         goto error;
@@ -201,15 +201,15 @@ static DetectFilesizeData *DetectFilesizeParse (const char *str)
     goto error;
     memset(fsd, 0, sizeof(DetectFilesizeData));
 
-    if (arg1[0] == '<')
+    if (arg1 != NULL && arg1[0] == '<')
         fsd->mode = DETECT_FILESIZE_LT;
-    else if (arg1[0] == '>')
+    else if (arg1 != NULL && arg1[0] == '>')
         fsd->mode = DETECT_FILESIZE_GT;
     else
         fsd->mode = DETECT_FILESIZE_EQ;
 
     if (arg3 != NULL && strcmp("<>", arg3) == 0) {
-        if (strlen(arg1) != 0) {
+        if (arg1 != NULL && strlen(arg1) != 0) {
             SCLogError(SC_ERR_INVALID_ARGUMENT,"Range specified but mode also set");
             goto error;
         }
index 0392f53b6c8c1cb2a3993ee5a3074bbce03662cd..d2edbe27048a7b464b69e4fcc336b59a2ff5a918 100644 (file)
@@ -185,7 +185,7 @@ static DetectFlowData *DetectFlowParse (DetectEngineCtx *de_ctx, const char *flo
 
     if (ret > 1) {
         pcre2len = sizeof(str1);
-        res = pcre2_substring_copy_bynumber(parse_regex.match, 1, (PCRE2_UCHAR8 *)str1, &pcre2len);
+        res = SC_pcre2_substring_copy(parse_regex.match, 1, (PCRE2_UCHAR8 *)str1, &pcre2len);
         if (res < 0) {
             SCLogError(SC_ERR_PCRE_GET_SUBSTRING, "pcre2_substring_copy_bynumber failed");
             goto error;
index a2241f796b9f8b06c1e3552d5dea5904e8b1fdd4..f5866815a769f84dbbb6d89c987928d438f1f6e9 100644 (file)
@@ -183,10 +183,10 @@ static DetectFragBitsData *DetectFragBitsParse (const char *rawstr)
     }
 
     for (i = 0; i < (ret - 1); i++) {
-        res = pcre2_substring_get_bynumber(
+        res = SC_pcre2_substring_get(
                 parse_regex.match, i + 1, (PCRE2_UCHAR8 **)&str_ptr, &pcre2_len);
         if (res < 0) {
-            SCLogError(SC_ERR_PCRE_GET_SUBSTRING, "pcre2_substring_get_bynumber failed");
+            SCLogError(SC_ERR_PCRE_GET_SUBSTRING, "pcre2_substring_get_bynumber failed %d", res);
             goto error;
         }
 
index 2e54103a54b988f9aa31e87105e82c64453a6936..d8647f37747654d8f1f763aa281f3fb78a94939b 100644 (file)
@@ -156,8 +156,7 @@ static DetectFragOffsetData *DetectFragOffsetParse (DetectEngineCtx *de_ctx, con
     }
 
     for (i = 1; i < ret; i++) {
-        res = pcre2_substring_get_bynumber(
-                parse_regex.match, i, (PCRE2_UCHAR8 **)&str_ptr, &pcre2_len);
+        res = SC_pcre2_substring_get(parse_regex.match, i, (PCRE2_UCHAR8 **)&str_ptr, &pcre2_len);
         if (res < 0) {
             SCLogError(SC_ERR_PCRE_GET_SUBSTRING, "pcre2_substring_get_bynumber failed");
             goto error;
index 0a091e9787ab193607a76ef7c58045c6631ad708..3dea8ad4fa72cacac2b7961dfd128d816975b6c9 100644 (file)
@@ -172,8 +172,7 @@ static DetectIcmpIdData *DetectIcmpIdParse (DetectEngineCtx *de_ctx, const char
     int i;
     const char *str_ptr;
     for (i = 1; i < ret; i++) {
-        res = pcre2_substring_get_bynumber(
-                parse_regex.match, i, (PCRE2_UCHAR8 **)&str_ptr, &pcre2_len);
+        res = SC_pcre2_substring_get(parse_regex.match, i, (PCRE2_UCHAR8 **)&str_ptr, &pcre2_len);
         if (res < 0) {
             SCLogError(SC_ERR_PCRE_GET_SUBSTRING, "pcre2_substring_get_bynumber failed");
             goto error;
index bc7dec06d9f06e395cc52122684ac765339861c3..707eab7e033eb2b272e3b90aaf7e54ed842a9e8c 100644 (file)
@@ -174,8 +174,7 @@ static DetectIcmpSeqData *DetectIcmpSeqParse (DetectEngineCtx *de_ctx, const cha
     }
 
     for (i = 1; i < ret; i++) {
-        res = pcre2_substring_get_bynumber(
-                parse_regex.match, i, (PCRE2_UCHAR8 **)&str_ptr, &pcre2_len);
+        res = SC_pcre2_substring_get(parse_regex.match, i, (PCRE2_UCHAR8 **)&str_ptr, &pcre2_len);
         if (res < 0) {
             SCLogError(SC_ERR_PCRE_GET_SUBSTRING, "pcre2_substring_get_bynumber failed");
             goto error;
index 102a65a8f9be84a682c43556766f7a89bad8c5d2..e106ea2c1fbeacf498706aa6de3bd4aa10cb0a48 100644 (file)
@@ -163,8 +163,7 @@ static DetectICodeData *DetectICodeParse(DetectEngineCtx *de_ctx, const char *ic
     int i;
     const char *str_ptr;
     for (i = 1; i < ret; i++) {
-        res = pcre2_substring_get_bynumber(
-                parse_regex.match, i, (PCRE2_UCHAR8 **)&str_ptr, &pcre2_len);
+        res = SC_pcre2_substring_get(parse_regex.match, i, (PCRE2_UCHAR8 **)&str_ptr, &pcre2_len);
         if (res < 0) {
             SCLogError(SC_ERR_PCRE_GET_SUBSTRING, "pcre2_substring_get_bynumber failed");
             goto error;
index 30a54c45d3de236b8a3869e257203dc591bf21d7..9663f194a5b0b631aac30cd12a5425ae228b5944 100644 (file)
@@ -163,8 +163,7 @@ static DetectITypeData *DetectITypeParse(DetectEngineCtx *de_ctx, const char *it
     int i;
     const char *str_ptr;
     for (i = 1; i < ret; i++) {
-        res = pcre2_substring_get_bynumber(
-                parse_regex.match, i, (PCRE2_UCHAR8 **)&str_ptr, &pcre2_len);
+        res = SC_pcre2_substring_get(parse_regex.match, i, (PCRE2_UCHAR8 **)&str_ptr, &pcre2_len);
         if (res < 0) {
             SCLogError(SC_ERR_PCRE_GET_SUBSTRING, "pcre2_substring_get_bynumber failed");
             goto error;
index 2f0a3005d762ad31b67a02a292da8f3ff4635e4e..22d0097f738ecdf2bc031024af4316d870ddda9c 100644 (file)
@@ -218,7 +218,7 @@ static DetectNfsProcedureData *DetectNfsProcedureParse (const char *rawstr)
     }
 
     pcre2len = sizeof(mode);
-    res = pcre2_substring_copy_bynumber(parse_regex.match, 1, (PCRE2_UCHAR8 *)mode, &pcre2len);
+    res = SC_pcre2_substring_copy(parse_regex.match, 1, (PCRE2_UCHAR8 *)mode, &pcre2len);
     if (res < 0) {
         SCLogError(SC_ERR_PCRE_GET_SUBSTRING, "pcre2_substring_copy_bynumber failed");
         goto error;
index 1f0bee7dcbbcbc9d458b28445747b4e83cd071e1..63b4345eb8cd6b8bc04a32a7d29e50ba45b55b97 100644 (file)
@@ -209,7 +209,7 @@ static DetectNfsVersionData *DetectNfsVersionParse (const char *rawstr)
     }
 
     pcre2len = sizeof(mode);
-    res = pcre2_substring_copy_bynumber(parse_regex.match, 1, (PCRE2_UCHAR8 *)mode, &pcre2len);
+    res = SC_pcre2_substring_copy(parse_regex.match, 1, (PCRE2_UCHAR8 *)mode, &pcre2len);
     if (res < 0) {
         SCLogError(SC_ERR_PCRE_GET_SUBSTRING, "pcre2_substring_copy_bynumber failed");
         goto error;
index 3ae1011258960abbe5e163013fcfd7d741f6b918..1d2b963d9159ec15f1e4c7fdca71ecf9d2d0e715 100644 (file)
@@ -2560,6 +2560,30 @@ DetectParseRegex2 *DetectSetupPCRE2(const char *parse_str, int opts)
     return detect_parse;
 }
 
+int SC_pcre2_substring_copy(
+        pcre2_match_data *match_data, uint32_t number, PCRE2_UCHAR *buffer, PCRE2_SIZE *bufflen)
+{
+    int r = pcre2_substring_copy_bynumber(match_data, number, buffer, bufflen);
+    if (r == PCRE2_ERROR_UNSET) {
+        buffer[0] = 0;
+        *bufflen = 0;
+        return 0;
+    }
+    return r;
+}
+
+int SC_pcre2_substring_get(
+        pcre2_match_data *match_data, uint32_t number, PCRE2_UCHAR **bufferptr, PCRE2_SIZE *bufflen)
+{
+    int r = pcre2_substring_get_bynumber(match_data, number, bufferptr, bufflen);
+    if (r == PCRE2_ERROR_UNSET) {
+        *bufferptr = NULL;
+        *bufflen = 0;
+        return 0;
+    }
+    return r;
+}
+
 void DetectSetupParseRegexes(const char *parse_str, DetectParseRegex *detect_parse)
 {
     if (!DetectSetupParseRegexesOpts(parse_str, detect_parse, 0)) {
index fe4fc3e648f660698a47ffb03008bd8cd8867fb5..bc5bf163f449662fa65db554bcb220b244d70cac 100644 (file)
@@ -105,6 +105,10 @@ void DetectParseFreeRegex(DetectParseRegex *r);
 /* parse regex exec */
 int DetectParsePcreExec(
         DetectParseRegex *parse_regex, const char *str, int start_offset, int options);
+int SC_pcre2_substring_copy(
+        pcre2_match_data *match_data, uint32_t number, PCRE2_UCHAR *buffer, PCRE2_SIZE *bufflen);
+int SC_pcre2_substring_get(pcre2_match_data *match_data, uint32_t number, PCRE2_UCHAR **bufferptr,
+        PCRE2_SIZE *bufflen);
 
 #endif /* __DETECT_PARSE_H__ */
 
index 28fc1c31ad63008637bd1546e6d013da848c5c03..d55965e78bbd25855c0c54a386a41f47f61b31b6 100644 (file)
@@ -174,7 +174,7 @@ static DetectRfbSectypeData *DetectRfbSectypeParse (const char *rawstr)
     }
 
     pcre2len = sizeof(mode);
-    res = pcre2_substring_copy_bynumber(parse_regex.match, 1, (PCRE2_UCHAR8 *)mode, &pcre2len);
+    res = SC_pcre2_substring_copy(parse_regex.match, 1, (PCRE2_UCHAR8 *)mode, &pcre2len);
     if (res < 0) {
         SCLogError(SC_ERR_PCRE_GET_SUBSTRING, "pcre2_substring_copy_bynumber failed");
         goto error;
index 342430ff8f5adf5bb4e2f2288e8899288bf2614c..56e12cf45512905f20fccd687a3c4e1bb13dd8f4 100644 (file)
@@ -188,7 +188,7 @@ static DetectSNMPVersionData *DetectSNMPVersionParse (const char *rawstr)
     }
 
     pcre2len = sizeof(mode);
-    res = pcre2_substring_copy_bynumber(parse_regex.match, 1, (PCRE2_UCHAR8 *)mode, &pcre2len);
+    res = SC_pcre2_substring_copy(parse_regex.match, 1, (PCRE2_UCHAR8 *)mode, &pcre2len);
     if (res < 0) {
         SCLogError(SC_ERR_PCRE_GET_SUBSTRING, "pcre2_substring_copy_bynumber failed");
         goto error;
index ec267206bbbf3ddfee3d1b67783b26fc25939c18..b9cbc3d6318cb180b65446f57805a88a4eff1bec 100644 (file)
@@ -215,7 +215,7 @@ static DetectSslStateData *DetectSslStateParse(const char *arg)
         SCLogError(SC_ERR_PCRE_COPY_SUBSTRING, "pcre2_substring_copy_bynumber failed");
         goto error;
     }
-    while (res > 0) {
+    while (res >= 0 && strlen(str1) > 0) {
         ret = DetectParsePcreExec(&parse_regex2, str1, 0, 0);
         if (ret < 1) {
             SCLogError(SC_ERR_INVALID_SIGNATURE, "Invalid arg \"%s\" supplied to "
@@ -233,7 +233,7 @@ static DetectSslStateData *DetectSslStateParse(const char *arg)
 
         pcre2len = sizeof(str2);
         res = pcre2_substring_copy_bynumber(parse_regex2.match, 2, (PCRE2_UCHAR8 *)str2, &pcre2len);
-        if (res <= 0) {
+        if (res < 0) {
             SCLogError(SC_ERR_PCRE_COPY_SUBSTRING, "pcre2_substring_copy_bynumber failed");
             goto error;
         }
index ea4bdca2ea04819708b659f218e28fb71ea0eb5d..9a1b67392d0d117b95385e032430b462e66c96f5 100644 (file)
@@ -189,7 +189,7 @@ static DetectFlagsData *DetectFlagsParse (const char *rawstr)
     }
 
     pcre2len = sizeof(arg1);
-    res = pcre2_substring_copy_bynumber(parse_regex.match, 1, (PCRE2_UCHAR8 *)arg1, &pcre2len);
+    res = SC_pcre2_substring_copy(parse_regex.match, 1, (PCRE2_UCHAR8 *)arg1, &pcre2len);
     if (res < 0) {
         SCLogError(SC_ERR_PCRE_GET_SUBSTRING, "pcre2_substring_copy_bynumber failed");
         SCReturnPtr(NULL, "DetectFlagsData");
@@ -204,7 +204,7 @@ static DetectFlagsData *DetectFlagsParse (const char *rawstr)
     }
     if (ret >= 3) {
         pcre2len = sizeof(arg3);
-        res = pcre2_substring_copy_bynumber(parse_regex.match, 3, (PCRE2_UCHAR8 *)arg3, &pcre2len);
+        res = SC_pcre2_substring_copy(parse_regex.match, 3, (PCRE2_UCHAR8 *)arg3, &pcre2len);
         if (res < 0) {
             SCLogError(SC_ERR_PCRE_GET_SUBSTRING, "pcre2_substring_copy_bynumber failed");
             SCReturnPtr(NULL, "DetectFlagsData");
index 43de305ff68f93a6df2f236fa7cf42a339179fbe..97d1c9a6f3a47e5f5de3a91d4bd550b6d192edfa 100644 (file)
@@ -127,8 +127,7 @@ static DetectWindowData *DetectWindowParse(DetectEngineCtx *de_ctx, const char *
     if (ret > 1) {
         char copy_str[128] = "";
         pcre2len = sizeof(copy_str);
-        res = pcre2_substring_copy_bynumber(
-                parse_regex.match, 1, (PCRE2_UCHAR8 *)copy_str, &pcre2len);
+        res = SC_pcre2_substring_copy(parse_regex.match, 1, (PCRE2_UCHAR8 *)copy_str, &pcre2len);
         if (res < 0) {
             SCLogError(SC_ERR_PCRE_GET_SUBSTRING, "pcre2_substring_copy_bynumber failed");
             goto error;
index e0bd4cf44c553f1abfc967460ad6e9a86e67bf94..d89cf09ab499e63982ac2975da48949caaef4037 100644 (file)
@@ -319,7 +319,7 @@ static DetectTlsValidityData *DetectTlsValidityParse (const char *rawstr)
     }
 
     pcre2len = sizeof(mode);
-    res = pcre2_substring_copy_bynumber(parse_regex.match, 1, (PCRE2_UCHAR8 *)mode, &pcre2len);
+    res = SC_pcre2_substring_copy(parse_regex.match, 1, (PCRE2_UCHAR8 *)mode, &pcre2len);
     if (res < 0) {
         SCLogError(SC_ERR_PCRE_GET_SUBSTRING, "pcre2_substring_copy_bynumber failed");
         goto error;
index e407e0f71b2c4cd93eb24c18b399d0bc6d340a2a..e9127ee854612d3cf958912dd0a85678d52573ca 100644 (file)
@@ -108,7 +108,7 @@ static DetectUrilenData *DetectUrilenParse (const char *urilenstr)
 
     SCLogDebug("ret %d", ret);
 
-    res = pcre2_substring_get_bynumber(parse_regex.match, 1, (PCRE2_UCHAR8 **)&str_ptr, &pcre2_len);
+    res = SC_pcre2_substring_get(parse_regex.match, 1, (PCRE2_UCHAR8 **)&str_ptr, &pcre2_len);
     if (res < 0) {
         SCLogError(SC_ERR_PCRE_GET_SUBSTRING, "pcre2_substring_get_bynumber failed");
         goto error;
@@ -125,8 +125,7 @@ static DetectUrilenData *DetectUrilenParse (const char *urilenstr)
     SCLogDebug("Arg2 \"%s\"", arg2);
 
     if (ret > 3) {
-        res = pcre2_substring_get_bynumber(
-                parse_regex.match, 3, (PCRE2_UCHAR8 **)&str_ptr, &pcre2_len);
+        res = SC_pcre2_substring_get(parse_regex.match, 3, (PCRE2_UCHAR8 **)&str_ptr, &pcre2_len);
         if (res < 0) {
             SCLogError(SC_ERR_PCRE_GET_SUBSTRING, "pcre2_substring_get_bynumber failed");
             goto error;
@@ -135,7 +134,7 @@ static DetectUrilenData *DetectUrilenParse (const char *urilenstr)
         SCLogDebug("Arg3 \"%s\"", arg3);
 
         if (ret > 4) {
-            res = pcre2_substring_get_bynumber(
+            res = SC_pcre2_substring_get(
                     parse_regex.match, 4, (PCRE2_UCHAR8 **)&str_ptr, &pcre2_len);
             if (res < 0) {
                 SCLogError(SC_ERR_PCRE_GET_SUBSTRING, "pcre2_substring_get_bynumber failed");
@@ -161,15 +160,15 @@ static DetectUrilenData *DetectUrilenParse (const char *urilenstr)
         goto error;
     memset(urilend, 0, sizeof(DetectUrilenData));
 
-    if (arg1[0] == '<')
+    if (arg1 != NULL && arg1[0] == '<')
         urilend->mode = DETECT_URILEN_LT;
-    else if (arg1[0] == '>')
+    else if (arg1 != NULL && arg1[0] == '>')
         urilend->mode = DETECT_URILEN_GT;
     else
         urilend->mode = DETECT_URILEN_EQ;
 
     if (arg3 != NULL && strcmp("<>", arg3) == 0) {
-        if (strlen(arg1) != 0) {
+        if (arg1 != NULL && strlen(arg1) != 0) {
             SCLogError(SC_ERR_INVALID_ARGUMENT,"Range specified but mode also set");
             goto error;
         }