Skip to content

Commit

Permalink
http1: remove transactions from their list
Browse files Browse the repository at this point in the history
instead of keeping a NULL pointer in an array

Ticket: #5921

(cherry picked from commit 8f63a8f)
  • Loading branch information
catenacyber authored and victorjulien committed Feb 7, 2024
1 parent ffed4b3 commit 18841a5
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 7 deletions.
16 changes: 9 additions & 7 deletions src/app-layer-htp.c
Original file line number Diff line number Diff line change
Expand Up @@ -402,7 +402,7 @@ void HTPStateFree(void *state)
uint64_t total_txs = HTPStateGetTxCnt(state);
/* free the list of body chunks */
if (s->conn != NULL) {
for (tx_id = 0; tx_id < total_txs; tx_id++) {
for (tx_id = s->tx_freed; tx_id < total_txs; tx_id++) {
htp_tx_t *tx = HTPStateGetTx(s, tx_id);
if (tx != NULL) {
HtpTxUserData *htud = (HtpTxUserData *) htp_tx_get_user_data(tx);
Expand Down Expand Up @@ -461,8 +461,10 @@ static void HTPStateTransactionFree(void *state, uint64_t id)
tx->request_progress = HTP_REQUEST_COMPLETE;
tx->response_progress = HTP_RESPONSE_COMPLETE;
}
// replaces tx in the s->conn->transactions list by NULL
htp_tx_destroy(tx);
}
s->tx_freed += htp_connp_tx_freed(s->connp);
}

/**
Expand Down Expand Up @@ -2976,7 +2978,7 @@ static uint64_t HTPStateGetTxCnt(void *alstate)
if (size < 0)
return 0ULL;
SCLogDebug("size %"PRIu64, size);
return (uint64_t)size;
return (uint64_t)size + http_state->tx_freed;
} else {
return 0ULL;
}
Expand All @@ -2986,8 +2988,8 @@ static void *HTPStateGetTx(void *alstate, uint64_t tx_id)
{
HtpState *http_state = (HtpState *)alstate;

if (http_state != NULL && http_state->conn != NULL)
return htp_list_get(http_state->conn->transactions, tx_id);
if (http_state != NULL && http_state->conn != NULL && tx_id >= http_state->tx_freed)
return htp_list_get(http_state->conn->transactions, tx_id - http_state->tx_freed);
else
return NULL;
}
Expand All @@ -2997,9 +2999,9 @@ void *HtpGetTxForH2(void *alstate)
// gets last transaction
HtpState *http_state = (HtpState *)alstate;
if (http_state != NULL && http_state->conn != NULL) {
size_t txid = htp_list_array_size(http_state->conn->transactions);
if (txid > 0) {
return htp_list_get(http_state->conn->transactions, txid - 1);
size_t txid = HTPStateGetTxCnt(http_state);
if (txid > http_state->tx_freed) {
return htp_list_get(http_state->conn->transactions, txid - http_state->tx_freed - 1);
}
}
return NULL;
Expand Down
7 changes: 7 additions & 0 deletions src/app-layer-htp.h
Original file line number Diff line number Diff line change
Expand Up @@ -252,6 +252,13 @@ typedef struct HtpState_ {
uint64_t store_tx_id;
FileContainer *files_ts;
FileContainer *files_tc;
// tx_freed is the number of already freed transactions
// This is needed as libhtp only keeps the live transactions :
// To get the total number of transactions, we need to add
// the number of transactions tracked by libhtp to this number.
// It is also needed as an offset to translate between suricata
// transaction id to libhtp offset in its list/array
uint64_t tx_freed;
const struct HTPCfgRec_ *cfg;
uint16_t flags;
uint16_t events;
Expand Down

0 comments on commit 18841a5

Please sign in to comment.