From 27c9423d5d252ede6beeb5b8a03b49a197eba0a3 Mon Sep 17 00:00:00 2001
From: Eric Leblond <eric@regit.org>
Date: Wed, 15 Aug 2012 14:04:03 +0200
Subject: [PATCH] Get rid of AppLayerHtpRegisterExtraCallbacks

This patch add a early exit condition to the body handling callback.
This permits to avoid to avoid a complex system to handle htp
object change.
---
 src/app-layer-htp.c |   38 ++++++++++----------------------------
 src/app-layer-htp.h |    1 -
 src/suricata.c      |    2 --
 3 files changed, 10 insertions(+), 31 deletions(-)

diff --git a/src/app-layer-htp.c b/src/app-layer-htp.c
index 1e29dc7..50b1615 100644
--- a/src/app-layer-htp.c
+++ b/src/app-layer-htp.c
@@ -1754,6 +1754,9 @@ int HTPCallbackRequestBodyData(htp_tx_data_t *d)
 {
     SCEnter();
 
+    if (need_htp_request_body == 0)
+        SCReturnInt(HOOK_OK);
+
 #ifdef PRINT
     printf("HTPBODY START: \n");
     PrintRawDataFp(stdout, (uint8_t *)d->data, d->len);
@@ -1874,6 +1877,9 @@ int HTPCallbackResponseBodyData(htp_tx_data_t *d)
 {
     SCEnter();
 
+    if (need_htp_response_body == 0)
+        SCReturnInt(HOOK_OK);
+
     HtpState *hstate = (HtpState *)d->tx->connp->user_data;
     if (hstate == NULL) {
         SCReturnInt(HOOK_ERROR);
@@ -2230,6 +2236,10 @@ static void HTPConfigure(void)
             htprec->response_body_limit = HTP_CONFIG_DEFAULT_REQUEST_BODY_LIMIT;
             htp_config_register_request(htp, HTPCallbackRequest);
             htp_config_register_response(htp, HTPCallbackResponse);
+            htp_config_register_request_body_data(htp,
+                                                  HTPCallbackRequestBodyData);
+            htp_config_register_response_body_data(htp,
+                                                   HTPCallbackResponseBodyData);
 #ifdef HAVE_HTP_URI_NORMALIZE_HOOK
             htp_config_register_request_uri_normalize(htp,
                     HTPCallbackRequestUriNormalize);
@@ -2410,34 +2420,6 @@ void RegisterHTPParsers(void)
     SCReturn;
 }
 
-/**
- * \brief This function is called at the end of SigLoadSignatures.  This function
- *        enables the htp layer to register a callback for the http request body.
- *        need_htp_request_body is a flag that informs the htp app layer that
- *        a module in the engine needs the http request body.
- */
-void AppLayerHtpRegisterExtraCallbacks(void) {
-    SCEnter();
-    SCLogDebug("Registering extra htp callbacks");
-
-    HTPCfgRec *p_cfglist = &cfglist;
-    while (p_cfglist != NULL) {
-        if (need_htp_request_body == 1) {
-            SCLogDebug("Registering callback htp_config_register_request_body_data on htp");
-            htp_config_register_request_body_data(p_cfglist->cfg,
-                                                  HTPCallbackRequestBodyData);
-        }
-        if (need_htp_response_body == 1) {
-            SCLogDebug("Registering callback htp_config_register_response_body_data on htp");
-            htp_config_register_response_body_data(p_cfglist->cfg,
-                                                   HTPCallbackResponseBodyData);
-        }
-        p_cfglist = p_cfglist->next;
-    }
-    SCReturn;
-}
-
-
 #ifdef UNITTESTS
 static HTPCfgRec cfglist_backup;
 
diff --git a/src/app-layer-htp.h b/src/app-layer-htp.h
index 52bdab6..38a6413 100644
--- a/src/app-layer-htp.h
+++ b/src/app-layer-htp.h
@@ -224,7 +224,6 @@ int HTPCallbackRequestBodyData(htp_tx_data_t *);
 int HtpTransactionGetLoggableId(Flow *);
 void HtpBodyPrint(HtpBody *);
 void HtpBodyFree(HtpBody *);
-void AppLayerHtpRegisterExtraCallbacks(void);
 /* To free the state from unittests using app-layer-htp */
 void HTPStateFree(void *);
 void AppLayerHtpEnableRequestBodyCallback(void);
diff --git a/src/suricata.c b/src/suricata.c
index 7d31fcc..62c1c62 100644
--- a/src/suricata.c
+++ b/src/suricata.c
@@ -1513,7 +1513,6 @@ int main(int argc, char **argv)
 
         AppLayerHtpEnableRequestBodyCallback();
         AppLayerHtpNeedFileInspection();
-        AppLayerHtpRegisterExtraCallbacks();
 
         UtInitialize();
         UTHRegisterTests();
@@ -1745,7 +1744,6 @@ int main(int argc, char **argv)
     SCCudaPBSetUpQueuesAndBuffers();
 #endif /* __SC_CUDA_SUPPORT__ */
 
-    AppLayerHtpRegisterExtraCallbacks();
     SCThresholdConfInitContext(de_ctx,NULL);
     SCAsn1LoadConfig();
 
-- 
1.7.10.4

