}
// Then, we will try to handle reassembly of different ranges of the same file
- htp_tx_t *tx = htp_list_get(s->conn->transactions, txid);
+ // TODO have the caller pass directly the tx
+ htp_tx_t *tx = htp_list_get(s->conn->transactions, txid - s->tx_freed);
if (!tx) {
SCReturnInt(-1);
}
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);
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);
}
/**
if (size < 0)
return 0ULL;
SCLogDebug("size %"PRIu64, size);
- return (uint64_t)size;
+ return (uint64_t)size + http_state->tx_freed;
} else {
return 0ULL;
}
{
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;
}
// 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;
htp_conn_t *conn;
Flow *f; /**< Needed to retrieve the original flow when using HTPLib callbacks */
uint64_t transaction_cnt;
+ // 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;