diff --git a/src/app-layer-htp-body.c b/src/app-layer-htp-body.c index 53194307b4..65ce30ad39 100644 --- a/src/app-layer-htp-body.c +++ b/src/app-layer-htp-body.c @@ -75,7 +75,8 @@ static StreamingBufferConfig default_cfg = { * \retval 0 ok * \retval -1 error */ -int HtpBodyAppendChunk(HtpBody *body, const uint8_t *data, uint32_t len) +int HtpBodyAppendChunk(const HTPCfgDir *hcfg, HtpBody *body, + const uint8_t *data, uint32_t len) { SCEnter(); @@ -86,7 +87,8 @@ int HtpBodyAppendChunk(HtpBody *body, const uint8_t *data, uint32_t len) } if (body->sb == NULL) { - body->sb = StreamingBufferInit(&default_cfg); + const StreamingBufferConfig *cfg = hcfg ? &hcfg->sbcfg : &default_cfg; + body->sb = StreamingBufferInit(cfg); if (body->sb == NULL) SCReturnInt(-1); } diff --git a/src/app-layer-htp-body.h b/src/app-layer-htp-body.h index e7d051e854..637eb07d61 100644 --- a/src/app-layer-htp-body.h +++ b/src/app-layer-htp-body.h @@ -28,7 +28,7 @@ #ifndef __APP_LAYER_HTP_BODY_H__ #define __APP_LAYER_HTP_BODY_H__ -int HtpBodyAppendChunk(HtpBody *, const uint8_t *, uint32_t); +int HtpBodyAppendChunk(const HTPCfgDir *, HtpBody *, const uint8_t *, uint32_t); void HtpBodyPrint(HtpBody *); void HtpBodyFree(HtpBody *); void HtpBodyPrune(HtpState *, HtpBody *, int); diff --git a/src/app-layer-htp.c b/src/app-layer-htp.c index f8069c757b..00d39365de 100644 --- a/src/app-layer-htp.c +++ b/src/app-layer-htp.c @@ -1765,7 +1765,7 @@ int HTPCallbackRequestBodyData(htp_tx_data_t *d) } SCLogDebug("len %u", len); - HtpBodyAppendChunk(&tx_ud->request_body, d->data, len); + HtpBodyAppendChunk(&hstate->cfg->request, &tx_ud->request_body, d->data, len); const uint8_t *chunks_buffer = NULL; uint32_t chunks_buffer_len = 0; @@ -1861,7 +1861,7 @@ int HTPCallbackResponseBodyData(htp_tx_data_t *d) } SCLogDebug("len %u", len); - HtpBodyAppendChunk(&tx_ud->response_body, d->data, len); + HtpBodyAppendChunk(&hstate->cfg->response, &tx_ud->response_body, d->data, len); HtpResponseBodyHandle(hstate, tx_ud, d->tx, (uint8_t *)d->data, (uint32_t)d->len); } else { @@ -2137,10 +2137,6 @@ static void HTPConfigSetDefaultsPhase1(HTPCfgRec *cfg_prec) #endif cfg_prec->randomize_range = HTP_CONFIG_DEFAULT_RANDOMIZE_RANGE; - cfg_prec->sbcfg.flags = 0; - cfg_prec->sbcfg.buf_size = cfg_prec->request_inspect_window; - cfg_prec->sbcfg.buf_slide = 0; - htp_config_register_request_header_data(cfg_prec->cfg, HTPCallbackRequestHeaderData); htp_config_register_request_trailer_data(cfg_prec->cfg, HTPCallbackRequestHeaderData); htp_config_register_response_header_data(cfg_prec->cfg, HTPCallbackResponseHeaderData); @@ -2213,6 +2209,23 @@ static void HTPConfigSetDefaultsPhase2(char *name, HTPCfgRec *cfg_prec) htp_config_register_request_line(cfg_prec->cfg, HTPCallbackRequestLine); + cfg_prec->request.sbcfg.flags = 0; + cfg_prec->request.sbcfg.buf_size = cfg_prec->request_inspect_window ? + cfg_prec->request_inspect_window : 256; + cfg_prec->request.sbcfg.buf_slide = 0; + cfg_prec->request.sbcfg.Malloc = HTPMalloc; + cfg_prec->request.sbcfg.Calloc = HTPCalloc; + cfg_prec->request.sbcfg.Realloc = HTPRealloc; + cfg_prec->request.sbcfg.Free = HTPFree; + + cfg_prec->response.sbcfg.flags = 0; + cfg_prec->response.sbcfg.buf_size = cfg_prec->response_inspect_window ? + cfg_prec->response_inspect_window : 256; + cfg_prec->response.sbcfg.buf_slide = 0; + cfg_prec->response.sbcfg.Malloc = HTPMalloc; + cfg_prec->response.sbcfg.Calloc = HTPCalloc; + cfg_prec->response.sbcfg.Realloc = HTPRealloc; + cfg_prec->response.sbcfg.Free = HTPFree; return; } @@ -5613,9 +5626,9 @@ static int HTPBodyReassemblyTest01(void) uint8_t chunk1[] = "--e5a320f21416a02493a0a6f561b1c494\r\nContent-Disposition: form-data; name=\"uploadfile\"; filename=\"D2GUef.jpg\"\r"; uint8_t chunk2[] = "POST /uri HTTP/1.1\r\nHost: hostname.com\r\nKeep-Alive: 115\r\nAccept-Charset: utf-8\r\nUser-Agent: Mozilla/5.0 (X11; Linux i686; rv:9.0.1) Gecko/20100101 Firefox/9.0.1\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nConnection: keep-alive\r\nContent-length: 68102\r\nReferer: http://otherhost.com\r\nAccept-Encoding: gzip\r\nContent-Type: multipart/form-data; boundary=e5a320f21416a02493a0a6f561b1c494\r\nCookie: blah\r\nAccept-Language: us\r\n\r\n--e5a320f21416a02493a0a6f561b1c494\r\nContent-Disposition: form-data; name=\"uploadfile\"; filename=\"D2GUef.jpg\"\r"; - int r = HtpBodyAppendChunk(&htud.request_body, chunk1, sizeof(chunk1)-1); + int r = HtpBodyAppendChunk(NULL, &htud.request_body, chunk1, sizeof(chunk1)-1); BUG_ON(r != 0); - r = HtpBodyAppendChunk(&htud.request_body, chunk2, sizeof(chunk2)-1); + r = HtpBodyAppendChunk(NULL, &htud.request_body, chunk2, sizeof(chunk2)-1); BUG_ON(r != 0); const uint8_t *chunks_buffer = NULL; diff --git a/src/app-layer-htp.h b/src/app-layer-htp.h index 3c7ae66cbf..039b1cfe8e 100644 --- a/src/app-layer-htp.h +++ b/src/app-layer-htp.h @@ -140,6 +140,10 @@ enum { #define HTP_PCRE_HAS_MATCH 0x02 /**< Flag to indicate that the chunks matched on some rule */ +typedef struct HTPCfgDir_ { + StreamingBufferConfig sbcfg; +} HTPCfgDir; + /** Need a linked list in order to keep track of these */ typedef struct HTPCfgRec_ { htp_cfg_t *cfg; @@ -160,7 +164,8 @@ typedef struct HTPCfgRec_ { int randomize_range; int http_body_inline; - StreamingBufferConfig sbcfg; + HTPCfgDir request; + HTPCfgDir response; } HTPCfgRec; /** Struct used to hold chunks of a body on a request */