]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
rust: bindgen SCDetectSignatureAddTransform
authorPhilippe Antoine <pantoine@oisf.net>
Fri, 2 May 2025 13:41:31 +0000 (15:41 +0200)
committerVictor Julien <victor@inliniac.net>
Sat, 10 May 2025 01:09:48 +0000 (03:09 +0200)
by moving it to detect-engine-buffer.h and prefixing it

Ticket: 7667

17 files changed:
rust/src/detect/transforms/casechange.rs
rust/src/detect/transforms/compress_whitespace.rs
rust/src/detect/transforms/domain.rs
rust/src/detect/transforms/dotprefix.rs
rust/src/detect/transforms/hash.rs
rust/src/detect/transforms/http_headers.rs
rust/src/detect/transforms/mod.rs
rust/src/detect/transforms/strip_whitespace.rs
rust/src/detect/transforms/urldecode.rs
rust/src/detect/transforms/xor.rs
rust/sys/src/sys.rs
src/detect-engine-buffer.c
src/detect-engine-buffer.h
src/detect-parse.c
src/detect-parse.h
src/detect-transform-base64.c
src/detect-transform-pcrexform.c

index 1413ad2c3f7c00d9ba4f5c1654a89ce32a522fc2..b9a7356fbc12334fcfd981670dbea7a8c1b2a2a9 100644 (file)
  */
 
 use super::{
-    DetectSignatureAddTransform, InspectionBufferCheckAndExpand, InspectionBufferLength,
-    InspectionBufferPtr, InspectionBufferTruncate, SCTransformTableElmt,
+    InspectionBufferCheckAndExpand, InspectionBufferLength, InspectionBufferPtr,
+    InspectionBufferTruncate,
 };
 use crate::detect::SIGMATCH_NOOPT;
 use suricata_sys::sys::{
     DetectEngineCtx, DetectEngineThreadCtx, InspectionBuffer, SCDetectHelperTransformRegister,
-    Signature,
+    SCDetectSignatureAddTransform, SCTransformTableElmt, Signature,
 };
 
 use std::os::raw::{c_int, c_void};
@@ -34,7 +34,7 @@ static mut G_TRANSFORM_TOUPPER_ID: c_int = 0;
 unsafe extern "C" fn tolower_setup(
     _de: *mut DetectEngineCtx, s: *mut Signature, _raw: *const std::os::raw::c_char,
 ) -> c_int {
-    return DetectSignatureAddTransform(s, G_TRANSFORM_TOLOWER_ID, ptr::null_mut());
+    return SCDetectSignatureAddTransform(s, G_TRANSFORM_TOLOWER_ID, ptr::null_mut());
 }
 
 fn tolower_transform_do(input: &[u8], output: &mut [u8]) {
@@ -96,7 +96,7 @@ pub unsafe extern "C" fn DetectTransformToLowerRegister() {
 unsafe extern "C" fn toupper_setup(
     _de: *mut DetectEngineCtx, s: *mut Signature, _raw: *const std::os::raw::c_char,
 ) -> c_int {
-    return DetectSignatureAddTransform(s, G_TRANSFORM_TOUPPER_ID, ptr::null_mut());
+    return SCDetectSignatureAddTransform(s, G_TRANSFORM_TOUPPER_ID, ptr::null_mut());
 }
 
 fn toupper_transform_do(input: &[u8], output: &mut [u8]) {
index a7d0dab8e20e8ff1fdd02028acc89220516b5360..25eab6283e24a6b8bfec9cfc261a43237dc3a7b6 100644 (file)
  */
 
 use super::{
-    DetectSignatureAddTransform, InspectionBufferCheckAndExpand, InspectionBufferLength,
-    InspectionBufferPtr, InspectionBufferTruncate, SCTransformTableElmt,
+    InspectionBufferCheckAndExpand, InspectionBufferLength, InspectionBufferPtr,
+    InspectionBufferTruncate,
 };
 use crate::detect::SIGMATCH_NOOPT;
 use suricata_sys::sys::{
     DetectEngineCtx, DetectEngineThreadCtx, InspectionBuffer, SCDetectHelperTransformRegister,
-    Signature,
+    SCDetectSignatureAddTransform, SCTransformTableElmt, Signature,
 };
 
 use std::os::raw::{c_int, c_void};
@@ -33,7 +33,7 @@ static mut G_TRANSFORM_COMPRESS_WHITESPACE_ID: c_int = 0;
 unsafe extern "C" fn compress_whitespace_setup(
     _de: *mut DetectEngineCtx, s: *mut Signature, _raw: *const std::os::raw::c_char,
 ) -> c_int {
-    return DetectSignatureAddTransform(s, G_TRANSFORM_COMPRESS_WHITESPACE_ID, ptr::null_mut());
+    return SCDetectSignatureAddTransform(s, G_TRANSFORM_COMPRESS_WHITESPACE_ID, ptr::null_mut());
 }
 
 fn compress_whitespace_transform_do(input: &[u8], output: &mut [u8]) -> u32 {
index 59a12ca362f7b7cd53a06e17f1cf9b5df8b1f105..eeb3595c80e8c784d9506065b7bb84ba0fbe3282 100644 (file)
  */
 
 use super::{
-    DetectSignatureAddTransform, InspectionBufferCheckAndExpand, InspectionBufferLength,
-    InspectionBufferPtr, InspectionBufferTruncate, SCTransformTableElmt,
+    InspectionBufferCheckAndExpand, InspectionBufferLength, InspectionBufferPtr,
+    InspectionBufferTruncate,
 };
 use crate::detect::SIGMATCH_NOOPT;
 use suricata_sys::sys::{
     DetectEngineCtx, DetectEngineThreadCtx, InspectionBuffer, SCDetectHelperTransformRegister,
-    Signature,
+    SCDetectSignatureAddTransform, SCTransformTableElmt, Signature,
 };
 
 use std::os::raw::{c_int, c_void};
@@ -34,7 +34,7 @@ static mut G_TRANSFORM_TLD_ID: c_int = 0;
 unsafe extern "C" fn domain_setup(
     _de: *mut DetectEngineCtx, s: *mut Signature, _raw: *const std::os::raw::c_char,
 ) -> c_int {
-    return DetectSignatureAddTransform(s, G_TRANSFORM_DOMAIN_ID, ptr::null_mut());
+    return SCDetectSignatureAddTransform(s, G_TRANSFORM_DOMAIN_ID, ptr::null_mut());
 }
 
 fn get_domain(input: &[u8], output: &mut [u8]) -> u32 {
@@ -72,7 +72,7 @@ unsafe extern "C" fn domain_transform(
 unsafe extern "C" fn tld_setup(
     _de: *mut DetectEngineCtx, s: *mut Signature, _raw: *const std::os::raw::c_char,
 ) -> c_int {
-    return DetectSignatureAddTransform(s, G_TRANSFORM_TLD_ID, ptr::null_mut());
+    return SCDetectSignatureAddTransform(s, G_TRANSFORM_TLD_ID, ptr::null_mut());
 }
 
 fn get_tld(input: &[u8], output: &mut [u8]) -> u32 {
index a492e8b2ec9787dfc9833d932db26302e1eb5218..141a19fe2b9248a14f3ba940cd0eddeea5b19384 100644 (file)
  */
 
 use super::{
-    DetectSignatureAddTransform, InspectionBufferCheckAndExpand, InspectionBufferLength,
-    InspectionBufferPtr, InspectionBufferTruncate, SCTransformTableElmt,
+    InspectionBufferCheckAndExpand, InspectionBufferLength, InspectionBufferPtr,
+    InspectionBufferTruncate,
 };
 use crate::detect::SIGMATCH_NOOPT;
 use suricata_sys::sys::{
     DetectEngineCtx, DetectEngineThreadCtx, InspectionBuffer, SCDetectHelperTransformRegister,
-    Signature,
+    SCDetectSignatureAddTransform, SCTransformTableElmt, Signature,
 };
 
 use std::os::raw::{c_int, c_void};
@@ -33,7 +33,7 @@ static mut G_TRANSFORM_DOT_PREFIX_ID: c_int = 0;
 unsafe extern "C" fn dot_prefix_setup(
     _de: *mut DetectEngineCtx, s: *mut Signature, _raw: *const std::os::raw::c_char,
 ) -> c_int {
-    return DetectSignatureAddTransform(s, G_TRANSFORM_DOT_PREFIX_ID, ptr::null_mut());
+    return SCDetectSignatureAddTransform(s, G_TRANSFORM_DOT_PREFIX_ID, ptr::null_mut());
 }
 
 fn dot_prefix_transform_do(input: &[u8], output: &mut [u8]) {
index a4482dd9afb5f3c78ed0e6669fb2d702e0b5e262..913fe7e4b35b2ab08c9ff7c5efa46a8f0d4cde8e 100644 (file)
  */
 
 use super::{
-    DetectSignatureAddTransform, InspectionBufferCheckAndExpand, InspectionBufferLength,
-    InspectionBufferPtr, InspectionBufferTruncate, SCTransformTableElmt,
+    InspectionBufferCheckAndExpand, InspectionBufferLength, InspectionBufferPtr,
+    InspectionBufferTruncate,
 };
 use crate::detect::SIGMATCH_NOOPT;
 use suricata_sys::sys::{
     DetectEngineCtx, DetectEngineThreadCtx, InspectionBuffer, SCDetectHelperTransformRegister,
-    Signature,
+    SCDetectSignatureAddTransform, SCTransformTableElmt, Signature,
 };
 
 use crate::ffi::hashing::{G_DISABLE_HASHING, SC_SHA1_LEN, SC_SHA256_LEN};
@@ -47,7 +47,7 @@ unsafe extern "C" fn md5_setup(
         SCLogError!("MD5 hashing has been disabled, needed for to_md5 keyword");
         return -1;
     }
-    return DetectSignatureAddTransform(s, G_TRANSFORM_MD5_ID, ptr::null_mut());
+    return SCDetectSignatureAddTransform(s, G_TRANSFORM_MD5_ID, ptr::null_mut());
 }
 
 fn md5_transform_do(input: &[u8], output: &mut [u8]) {
@@ -101,7 +101,7 @@ unsafe extern "C" fn sha1_setup(
         SCLogError!("SHA1 hashing has been disabled, needed for to_sha1 keyword");
         return -1;
     }
-    return DetectSignatureAddTransform(s, G_TRANSFORM_SHA1_ID, ptr::null_mut());
+    return SCDetectSignatureAddTransform(s, G_TRANSFORM_SHA1_ID, ptr::null_mut());
 }
 
 fn sha1_transform_do(input: &[u8], output: &mut [u8]) {
@@ -155,7 +155,7 @@ unsafe extern "C" fn sha256_setup(
         SCLogError!("SHA256 hashing has been disabled, needed for to_sha256 keyword");
         return -1;
     }
-    return DetectSignatureAddTransform(s, G_TRANSFORM_SHA256_ID, ptr::null_mut());
+    return SCDetectSignatureAddTransform(s, G_TRANSFORM_SHA256_ID, ptr::null_mut());
 }
 
 fn sha256_transform_do(input: &[u8], output: &mut [u8]) {
index d268ebb7be1c37759590d0341bdf8e7cd7da1bfd..49366c1d7041f8c6f39bd2cdf65fd5ede4913bd2 100644 (file)
  */
 
 use super::{
-    DetectSignatureAddTransform, InspectionBufferCheckAndExpand, InspectionBufferLength,
-    InspectionBufferPtr, InspectionBufferTruncate, SCTransformTableElmt,
+    InspectionBufferCheckAndExpand, InspectionBufferLength, InspectionBufferPtr,
+    InspectionBufferTruncate,
 };
 use crate::detect::SIGMATCH_NOOPT;
 use suricata_sys::sys::{
     DetectEngineCtx, DetectEngineThreadCtx, InspectionBuffer, SCDetectHelperTransformRegister,
-    Signature,
+    SCDetectSignatureAddTransform, SCTransformTableElmt, Signature,
 };
 
 use std::os::raw::{c_int, c_void};
@@ -34,7 +34,7 @@ static mut G_TRANSFORM_STRIP_PSEUDO_ID: c_int = 0;
 unsafe extern "C" fn header_lowersetup(
     _de: *mut DetectEngineCtx, s: *mut Signature, _raw: *const std::os::raw::c_char,
 ) -> c_int {
-    return DetectSignatureAddTransform(s, G_TRANSFORM_HEADER_LOWER_ID, ptr::null_mut());
+    return SCDetectSignatureAddTransform(s, G_TRANSFORM_HEADER_LOWER_ID, ptr::null_mut());
 }
 
 fn header_lowertransform_do(input: &[u8], output: &mut [u8]) {
@@ -99,7 +99,7 @@ pub unsafe extern "C" fn DetectTransformHeaderLowercaseRegister() {
 unsafe extern "C" fn strip_pseudo_setup(
     _de: *mut DetectEngineCtx, s: *mut Signature, _raw: *const std::os::raw::c_char,
 ) -> c_int {
-    return DetectSignatureAddTransform(s, G_TRANSFORM_STRIP_PSEUDO_ID, ptr::null_mut());
+    return SCDetectSignatureAddTransform(s, G_TRANSFORM_STRIP_PSEUDO_ID, ptr::null_mut());
 }
 
 fn strip_pseudo_transform_do(input: &[u8], output: &mut [u8]) -> u32 {
index 48a946f23efd0905c1a89150d3cab2f776876c03..bffcfe66425167e656d124f854a83ad08b9822c1 100644 (file)
@@ -17,9 +17,7 @@
 
 //! Module for transforms
 
-use std::os::raw::{c_int, c_void};
-
-use suricata_sys::sys::{InspectionBuffer, SCTransformTableElmt, Signature};
+use suricata_sys::sys::InspectionBuffer;
 
 pub mod casechange;
 pub mod compress_whitespace;
@@ -33,9 +31,6 @@ pub mod xor;
 
 /// cbindgen:ignore
 extern "C" {
-    pub fn DetectSignatureAddTransform(
-        s: *mut Signature, transform_id: c_int, ctx: *mut c_void,
-    ) -> c_int;
     pub fn InspectionBufferPtr(buf: *const InspectionBuffer) -> *const u8;
     pub fn InspectionBufferLength(buf: *const InspectionBuffer) -> u32;
     pub fn InspectionBufferCopy(ibuf: *const InspectionBuffer, buf: *const u8, buf_len: u32);
index b03443abf0c6ecaf1d391c7135e0272c13a5eee2..9298614abbb4ce466158a8ebb9ae7e0dc4b86afd 100644 (file)
  */
 
 use super::{
-    DetectSignatureAddTransform, InspectionBufferCheckAndExpand, InspectionBufferLength,
-    InspectionBufferPtr, InspectionBufferTruncate, SCTransformTableElmt,
+    InspectionBufferCheckAndExpand, InspectionBufferLength, InspectionBufferPtr,
+    InspectionBufferTruncate,
 };
 use crate::detect::SIGMATCH_NOOPT;
 use suricata_sys::sys::{
     DetectEngineCtx, DetectEngineThreadCtx, InspectionBuffer, SCDetectHelperTransformRegister,
-    Signature,
+    SCDetectSignatureAddTransform, SCTransformTableElmt, Signature,
 };
 
 use std::os::raw::{c_int, c_void};
@@ -33,7 +33,7 @@ static mut G_TRANSFORM_STRIP_WHITESPACE_ID: c_int = 0;
 unsafe extern "C" fn strip_whitespace_setup(
     _de: *mut DetectEngineCtx, s: *mut Signature, _raw: *const std::os::raw::c_char,
 ) -> c_int {
-    return DetectSignatureAddTransform(s, G_TRANSFORM_STRIP_WHITESPACE_ID, ptr::null_mut());
+    return SCDetectSignatureAddTransform(s, G_TRANSFORM_STRIP_WHITESPACE_ID, ptr::null_mut());
 }
 
 fn strip_whitespace_transform_do(input: &[u8], output: &mut [u8]) -> u32 {
index e267b4498544f4c60bc56a14049d56aa71b77444..0aa46def2541f0e3c0fead6cc6ff736fff12b9c5 100644 (file)
  */
 
 use super::{
-    DetectSignatureAddTransform, InspectionBufferCheckAndExpand, InspectionBufferLength,
-    InspectionBufferPtr, InspectionBufferTruncate, SCTransformTableElmt,
+    InspectionBufferCheckAndExpand, InspectionBufferLength, InspectionBufferPtr,
+    InspectionBufferTruncate,
 };
 use crate::detect::SIGMATCH_NOOPT;
 use suricata_sys::sys::{
     DetectEngineCtx, DetectEngineThreadCtx, InspectionBuffer, SCDetectHelperTransformRegister,
-    Signature,
+    SCDetectSignatureAddTransform, SCTransformTableElmt, Signature,
 };
 
 use std::os::raw::{c_int, c_void};
@@ -33,7 +33,7 @@ static mut G_TRANSFORM_URL_DECODE_ID: c_int = 0;
 unsafe extern "C" fn url_decode_setup(
     _de: *mut DetectEngineCtx, s: *mut Signature, _opt: *const std::os::raw::c_char,
 ) -> c_int {
-    return DetectSignatureAddTransform(s, G_TRANSFORM_URL_DECODE_ID, ptr::null_mut());
+    return SCDetectSignatureAddTransform(s, G_TRANSFORM_URL_DECODE_ID, ptr::null_mut());
 }
 
 fn hex_value(i: u8) -> Option<u8> {
index 7bcfd36cc413d67b4daf08ad604491e40b9aca9c..fdafea974b2d08afd7a454788ae831e7271bd720 100644 (file)
  */
 
 use super::{
-    DetectSignatureAddTransform, InspectionBufferCheckAndExpand, InspectionBufferLength,
-    InspectionBufferPtr, InspectionBufferTruncate, SCTransformTableElmt,
+    InspectionBufferCheckAndExpand, InspectionBufferLength, InspectionBufferPtr,
+    InspectionBufferTruncate,
 };
 use crate::detect::SIGMATCH_QUOTES_MANDATORY;
 use suricata_sys::sys::{
     DetectEngineCtx, DetectEngineThreadCtx, InspectionBuffer, SCDetectHelperTransformRegister,
-    Signature,
+    SCDetectSignatureAddTransform, SCTransformTableElmt, Signature,
 };
 
 use std::ffi::CStr;
@@ -69,7 +69,7 @@ unsafe extern "C" fn xor_setup(
     if ctx.is_null() {
         return -1;
     }
-    let r = DetectSignatureAddTransform(s, G_TRANSFORM_XOR_ID, ctx);
+    let r = SCDetectSignatureAddTransform(s, G_TRANSFORM_XOR_ID, ctx);
     if r != 0 {
         xor_free(de, ctx);
     }
index 7bd89a1fd198c84a36350da0410ec13bd74b03fe..7622b4d67332c4ff6d7ec7b108d51b3181d60044 100644 (file)
@@ -193,6 +193,11 @@ extern "C" {
         de_ctx: *mut DetectEngineCtx, s: *mut Signature, list: ::std::os::raw::c_int,
     ) -> ::std::os::raw::c_int;
 }
+extern "C" {
+    pub fn SCDetectSignatureAddTransform(
+        s: *mut Signature, transform: ::std::os::raw::c_int, options: *mut ::std::os::raw::c_void,
+    ) -> ::std::os::raw::c_int;
+}
 #[repr(C)]
 #[derive(Debug, Copy, Clone)]
 pub struct Flow_ {
index 2026480e566fb3025ff59fc5d13334f723746fcc..9041315af1f1cc81b83240e459c16713ad767ede 100644 (file)
@@ -174,3 +174,26 @@ SigMatch *DetectBufferGetLastSigMatch(const Signature *s, const uint32_t buf_id)
     }
     return last;
 }
+
+int SCDetectSignatureAddTransform(Signature *s, int transform, void *options)
+{
+    /* we only support buffers */
+    if (s->init_data->list == 0) {
+        SCReturnInt(-1);
+    }
+    if (!s->init_data->list_set) {
+        SCLogError("transforms must directly follow stickybuffers");
+        SCReturnInt(-1);
+    }
+    if (s->init_data->transforms.cnt >= DETECT_TRANSFORMS_MAX) {
+        SCReturnInt(-1);
+    }
+
+    s->init_data->transforms.transforms[s->init_data->transforms.cnt].transform = transform;
+    s->init_data->transforms.transforms[s->init_data->transforms.cnt].options = options;
+
+    s->init_data->transforms.cnt++;
+    SCLogDebug("Added transform #%d [%s]", s->init_data->transforms.cnt, s->sig_str);
+
+    SCReturnInt(0);
+}
index aa2ecd63693af28f618bf7842af9c1099115e9b6..0a6663d85b5a1f44d513ea76602bfd36cbbfb7a3 100644 (file)
@@ -34,5 +34,6 @@ int WARN_UNUSED SCDetectBufferSetActiveList(DetectEngineCtx *de_ctx, Signature *
 int DetectBufferGetActiveList(DetectEngineCtx *de_ctx, Signature *s);
 SigMatch *DetectBufferGetFirstSigMatch(const Signature *s, const uint32_t buf_id);
 SigMatch *DetectBufferGetLastSigMatch(const Signature *s, const uint32_t buf_id);
+int SCDetectSignatureAddTransform(Signature *s, int transform, void *options);
 
 #endif /* SURICATA_DETECT_ENGINE_BUFFER_H */
index 0263ea3d5e374e848f03dbefd4c51d4a2b740048..09bd094743ececf7dae6994a8ed819bd4f22809e 100644 (file)
@@ -2197,31 +2197,6 @@ void SigFree(DetectEngineCtx *de_ctx, Signature *s)
     SCFree(s);
 }
 
-int DetectSignatureAddTransform(Signature *s, int transform, void *options)
-{
-    /* we only support buffers */
-    if (s->init_data->list == 0) {
-        SCReturnInt(-1);
-    }
-    if (!s->init_data->list_set) {
-        SCLogError("transforms must directly follow stickybuffers");
-        SCReturnInt(-1);
-    }
-    if (s->init_data->transforms.cnt >= DETECT_TRANSFORMS_MAX) {
-        SCReturnInt(-1);
-    }
-
-    s->init_data->transforms.transforms[s->init_data->transforms.cnt].transform = transform;
-    s->init_data->transforms.transforms[s->init_data->transforms.cnt].options = options;
-
-    s->init_data->transforms.cnt++;
-    SCLogDebug("Added transform #%d [%s]",
-            s->init_data->transforms.cnt,
-            s->sig_str);
-
-    SCReturnInt(0);
-}
-
 /**
  * \brief this function is used to set multiple possible app-layer protos
  * \brief into the current signature (for example ja4 for both tls and quic)
index ddc0b11984d7922b518d30cace17729a2727c103..2ad453249e32dd7a53c1355e5947da18a14fb403 100644 (file)
@@ -101,7 +101,6 @@ SigMatch *DetectGetLastSMFromLists(const Signature *s, ...);
 SigMatch *DetectGetLastSMByListPtr(const Signature *s, SigMatch *sm_list, ...);
 SigMatch *DetectGetLastSMByListId(const Signature *s, int list_id, ...);
 
-int DetectSignatureAddTransform(Signature *s, int transform, void *options);
 int WARN_UNUSED DetectSignatureSetAppProto(Signature *s, AppProto alproto);
 int WARN_UNUSED DetectSignatureSetMultiAppProto(Signature *s, const AppProto *alprotos);
 
index 80f344a6801cd084751421ceb6bba55cc254f8ff..a488a7fce666678c221e0473885b1e9af05b8ecf 100644 (file)
@@ -26,8 +26,8 @@
 #include "suricata-common.h"
 
 #include "detect.h"
-#include "detect-parse.h"
 #include "detect-engine.h"
+#include "detect-engine-buffer.h"
 #include "detect-byte.h"
 
 #include "rust.h"
@@ -105,7 +105,7 @@ static int DetectTransformFromBase64DecodeSetup(
         goto exit_path;
     }
 
-    r = DetectSignatureAddTransform(s, DETECT_TRANSFORM_FROM_BASE64, b64d);
+    r = SCDetectSignatureAddTransform(s, DETECT_TRANSFORM_FROM_BASE64, b64d);
 
 exit_path:
     if (r != 0)
index b24ad64f80d2f7cae64db1fa79eeb8432d2d8b45..24b02bfb4af40f0ca3ded561b501aeea63b9b166 100644 (file)
@@ -27,7 +27,7 @@
 
 #include "detect.h"
 #include "detect-engine.h"
-#include "detect-parse.h"
+#include "detect-engine-buffer.h"
 #include "detect-transform-pcrexform.h"
 #include "detect-pcre.h"
 
@@ -125,7 +125,7 @@ static int DetectTransformPcrexformSetup (DetectEngineCtx *de_ctx, Signature *s,
         SCReturnInt(-1);
     }
 
-    int r = DetectSignatureAddTransform(s, DETECT_TRANSFORM_PCREXFORM, pxd);
+    int r = SCDetectSignatureAddTransform(s, DETECT_TRANSFORM_PCREXFORM, pxd);
     if (r != 0) {
         DetectTransformPcrexformFree(de_ctx, pxd);
     }