mirror of https://github.com/OISF/suricata
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
117 lines
3.3 KiB
C
117 lines
3.3 KiB
C
/*
|
|
* LibHTP (http://www.libhtp.org)
|
|
* Copyright 2009,2010 Ivan Ristic <ivanr@webkreator.com>
|
|
*
|
|
* LibHTP is an open source product, released under terms of the General Public Licence
|
|
* version 2 (GPLv2). Please refer to the file LICENSE, which contains the complete text
|
|
* of the license.
|
|
*
|
|
* In addition, there is a special exception that allows LibHTP to be freely
|
|
* used with any OSI-approved open source licence. Please refer to the file
|
|
* LIBHTP_LICENSING_EXCEPTION for the full text of the exception.
|
|
*
|
|
*/
|
|
|
|
#include "htp.h"
|
|
|
|
/**
|
|
* Creates a new connection structure.
|
|
*
|
|
* @param connp
|
|
* @return A new htp_connp_t structure on success, NULL on memory allocation failure.
|
|
*/
|
|
htp_conn_t *htp_conn_create(htp_connp_t *connp) {
|
|
htp_conn_t *conn = calloc(1, sizeof (htp_conn_t));
|
|
if (conn == NULL) return NULL;
|
|
|
|
conn->connp = connp;
|
|
|
|
conn->transactions = list_array_create(16);
|
|
if (conn->transactions == NULL) {
|
|
free(conn);
|
|
return NULL;
|
|
}
|
|
|
|
conn->messages = list_array_create(8);
|
|
if (conn->messages == NULL) {
|
|
list_destroy(conn->transactions);
|
|
free(conn);
|
|
return NULL;
|
|
}
|
|
|
|
return conn;
|
|
}
|
|
|
|
/**
|
|
* Destroys a connection, as well as all the transactions it contains. It is
|
|
* not possible to destroy a connection structure yet leave any of its
|
|
* transactions intact. This is because transactions need its connection and
|
|
* connection structures hold little data anyway. The opposite is true, though
|
|
* it is possible to delete a transaction but leave its connection alive.
|
|
*
|
|
* @param conn
|
|
*/
|
|
void htp_conn_destroy(htp_conn_t *conn) {
|
|
if (conn == NULL) return;
|
|
|
|
// Destroy individual transactions. Do note that iterating
|
|
// using the iterator does not work here because some of the
|
|
// list element may be NULL (and with the iterator it is impossible
|
|
// to distinguish a NULL element from the end of the list).
|
|
size_t i;
|
|
for (i = 0; i < list_size(conn->transactions); i++) {
|
|
htp_tx_t *tx = (htp_tx_t *)list_get(conn->transactions, i);
|
|
if (tx != NULL) {
|
|
htp_tx_destroy(tx);
|
|
}
|
|
}
|
|
|
|
list_destroy(conn->transactions);
|
|
|
|
// Destroy individual messages
|
|
htp_log_t *l = NULL;
|
|
list_iterator_reset(conn->messages);
|
|
while ((l = list_iterator_next(conn->messages)) != NULL) {
|
|
free((void *)l->msg);
|
|
free(l);
|
|
}
|
|
|
|
list_destroy(conn->messages);
|
|
|
|
if (conn->local_addr != NULL) {
|
|
free(conn->local_addr);
|
|
}
|
|
|
|
if (conn->remote_addr != NULL) {
|
|
free(conn->remote_addr);
|
|
}
|
|
|
|
// Finally, destroy the connection
|
|
// structure itself.
|
|
free(conn);
|
|
}
|
|
|
|
/**
|
|
* Removes the given transaction structure, which makes it possible to
|
|
* safely destroy it. It is safe to destroy transactions in this way
|
|
* because the index of the transactions (in a connection) is preserved.
|
|
*
|
|
* @param conn
|
|
* @param tx
|
|
* @return 1 if transaction was removed or 0 if it wasn't found
|
|
*/
|
|
int htp_conn_remove_tx(htp_conn_t *conn, htp_tx_t *tx) {
|
|
if ((tx == NULL)||(conn == NULL)) return 0;
|
|
|
|
unsigned int i = 0;
|
|
for (i = 0; i < list_size(conn->transactions); i++) {
|
|
htp_tx_t *etx = list_get(conn->transactions, i);
|
|
if (tx == etx) {
|
|
list_replace(conn->transactions, i, NULL);
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|