htp: alloc user data at tx start

This way the AppLayerTxData is set up from the start. Any type of
processing (logging, detection) will lead to setting up the user
data later on anyway.

Remove other places where it was added.
pull/5169/head
Victor Julien 5 years ago
parent f7ff7dbaed
commit 274a033d65

@ -1860,14 +1860,7 @@ static int HTPCallbackRequestBodyData(htp_tx_data_t *d)
HtpTxUserData *tx_ud = (HtpTxUserData *) htp_tx_get_user_data(d->tx);
if (tx_ud == NULL) {
tx_ud = HTPMalloc(sizeof(HtpTxUserData));
if (unlikely(tx_ud == NULL)) {
SCReturnInt(HTP_OK);
}
memset(tx_ud, 0, sizeof(HtpTxUserData));
/* Set the user data for handling body chunks on this transaction */
htp_tx_set_user_data(d->tx, tx_ud);
SCReturnInt(HTP_OK);
}
if (!tx_ud->response_body_init) {
tx_ud->response_body_init = 1;
@ -1996,14 +1989,7 @@ static int HTPCallbackResponseBodyData(htp_tx_data_t *d)
HtpTxUserData *tx_ud = (HtpTxUserData *) htp_tx_get_user_data(d->tx);
if (tx_ud == NULL) {
tx_ud = HTPMalloc(sizeof(HtpTxUserData));
if (unlikely(tx_ud == NULL)) {
SCReturnInt(HTP_OK);
}
memset(tx_ud, 0, sizeof(HtpTxUserData));
/* Set the user data for handling body chunks on this transaction */
htp_tx_set_user_data(d->tx, tx_ud);
SCReturnInt(HTP_OK);
}
if (!tx_ud->request_body_init) {
tx_ud->request_body_init = 1;
@ -2136,6 +2122,15 @@ static int HTPCallbackRequestStart(htp_tx_t *tx)
if (hstate->cfg)
StreamTcpReassemblySetMinInspectDepth(hstate->f->protoctx, STREAM_TOSERVER,
hstate->cfg->request.inspect_min_size);
HtpTxUserData *tx_ud = (HtpTxUserData *) htp_tx_get_user_data(tx);
if (tx_ud == NULL) {
tx_ud = HTPCalloc(1, sizeof(HtpTxUserData));
if (unlikely(tx_ud == NULL)) {
SCReturnInt(HTP_OK);
}
htp_tx_set_user_data(tx, tx_ud);
}
SCReturnInt(HTP_OK);
}
@ -2153,6 +2148,15 @@ static int HTPCallbackResponseStart(htp_tx_t *tx)
if (hstate->cfg)
StreamTcpReassemblySetMinInspectDepth(hstate->f->protoctx, STREAM_TOCLIENT,
hstate->cfg->response.inspect_min_size);
HtpTxUserData *tx_ud = (HtpTxUserData *) htp_tx_get_user_data(tx);
if (tx_ud == NULL) {
tx_ud = HTPCalloc(1, sizeof(HtpTxUserData));
if (unlikely(tx_ud == NULL)) {
SCReturnInt(HTP_OK);
}
htp_tx_set_user_data(tx, tx_ud);
}
SCReturnInt(HTP_OK);
}
@ -2296,12 +2300,8 @@ static int HTPCallbackDoubleDecodeUriPart(htp_tx_t *tx, bstr *part)
// shorter string means that uri was encoded
if (res == HTP_OK && prevlen > bstr_len(part)) {
HtpTxUserData *htud = (HtpTxUserData *) htp_tx_get_user_data(tx);
if (likely(htud == NULL)) {
htud = HTPCalloc(1, sizeof(*htud));
if (unlikely(htud == NULL))
return HTP_OK;
htp_tx_set_user_data(tx, htud);
}
if (htud == NULL)
return HTP_OK;
HtpState *s = htp_connp_get_user_data(tx->connp);
if (s == NULL)
return HTP_OK;
@ -2336,20 +2336,12 @@ static int HTPCallbackRequestHeaderData(htp_tx_data_t *tx_data)
HtpTxUserData *tx_ud = htp_tx_get_user_data(tx_data->tx);
if (tx_ud == NULL) {
tx_ud = HTPMalloc(sizeof(*tx_ud));
if (unlikely(tx_ud == NULL))
return HTP_OK;
memset(tx_ud, 0, sizeof(*tx_ud));
htp_tx_set_user_data(tx_data->tx, tx_ud);
return HTP_OK;
}
ptmp = HTPRealloc(tx_ud->request_headers_raw,
tx_ud->request_headers_raw_len,
tx_ud->request_headers_raw_len + tx_data->len);
if (ptmp == NULL) {
/* error: we're freeing the entire user data */
HtpState *hstate = htp_connp_get_user_data(tx_data->tx->connp);
HtpTxUserDataFree(hstate, tx_ud);
htp_tx_set_user_data(tx_data->tx, NULL);
return HTP_OK;
}
tx_ud->request_headers_raw = ptmp;
@ -2373,20 +2365,12 @@ static int HTPCallbackResponseHeaderData(htp_tx_data_t *tx_data)
HtpTxUserData *tx_ud = htp_tx_get_user_data(tx_data->tx);
if (tx_ud == NULL) {
tx_ud = HTPMalloc(sizeof(*tx_ud));
if (unlikely(tx_ud == NULL))
return HTP_OK;
memset(tx_ud, 0, sizeof(*tx_ud));
htp_tx_set_user_data(tx_data->tx, tx_ud);
return HTP_OK;
}
ptmp = HTPRealloc(tx_ud->response_headers_raw,
tx_ud->response_headers_raw_len,
tx_ud->response_headers_raw_len + tx_data->len);
if (ptmp == NULL) {
/* error: we're freeing the entire user data */
HtpState *hstate = htp_connp_get_user_data(tx_data->tx->connp);
HtpTxUserDataFree(hstate, tx_ud);
htp_tx_set_user_data(tx_data->tx, NULL);
return HTP_OK;
}
tx_ud->response_headers_raw = ptmp;
@ -3083,11 +3067,7 @@ static int HTPSetTxDetectState(void *vtx, DetectEngineState *s)
htp_tx_t *tx = (htp_tx_t *)vtx;
HtpTxUserData *tx_ud = htp_tx_get_user_data(tx);
if (tx_ud == NULL) {
tx_ud = HTPMalloc(sizeof(*tx_ud));
if (unlikely(tx_ud == NULL))
return -ENOMEM;
memset(tx_ud, 0, sizeof(*tx_ud));
htp_tx_set_user_data(tx, tx_ud);
return -ENOMEM;
}
tx_ud->de_state = s;
return 0;

Loading…
Cancel
Save