diff options
Diffstat (limited to 'analyzer/parser/parser.c')
| -rw-r--r-- | analyzer/parser/parser.c | 37 |
1 files changed, 17 insertions, 20 deletions
diff --git a/analyzer/parser/parser.c b/analyzer/parser/parser.c index 07980e5..9265153 100644 --- a/analyzer/parser/parser.c +++ b/analyzer/parser/parser.c @@ -5,8 +5,16 @@ #include "parser/find_parse_functions.h" #include "utils/memory.h" +// function to cleanup ParsedData in DynArray +void cleanup_parsed_data(void *parsed_data) { + ParsedData *data = parsed_data; + if (data->data_cleanup) + data->data_cleanup(data->data); + free(data->data); +} + // find earliest data to parse in stream -byte_t *find_earliest_data(TCPStream *stream, int stream_offset, int *earliest_length, parse_function_t **earliest_parse_fun) { +byte_t *find_earliest_data(TCPStream *stream, size_t stream_offset, int *earliest_length, parse_function_t **earliest_parse_fun) { byte_t *earliest_data = NULL; for (size_t i = 0; i < ARR_LEN(all_find_parse_functions); i++) { // ignore if not correct stream @@ -14,7 +22,7 @@ byte_t *find_earliest_data(TCPStream *stream, int stream_offset, int *earliest_l continue; int length; - byte_t *data = all_find_parse_functions[i].find_fn(stream, stream_offset, &length); + byte_t *data = all_find_parse_functions[i].find_fn(stream->bytes.data + stream_offset, stream->bytes.count - stream_offset, &length); // if it's the first found or earlier than earliest - save it if (data && (!earliest_data || data < earliest_data)) { earliest_data = data; @@ -25,12 +33,10 @@ byte_t *find_earliest_data(TCPStream *stream, int stream_offset, int *earliest_l return earliest_data; } -ParsedData *parse_stream(TCPStream *stream, size_t *parsed_len, size_t *n_parsed_data) { - size_t parsed_data_capacity = INIT_PARSED_DATA_CAPACITY; - ParsedData *parsed_data = safe_malloc(parsed_data_capacity * sizeof(ParsedData)); - *n_parsed_data = 0; +DynArray parse_stream(TCPStream *stream, size_t *parsed_len) { + DynArray parsed_data = array_new(sizeof(ParsedData), INIT_PARSED_DATA_CAPACITY, cleanup_parsed_data); - int stream_offset = 0; + size_t stream_offset = 0; byte_t *earliest_data; do { // find earliest data to parse @@ -41,28 +47,19 @@ ParsedData *parse_stream(TCPStream *stream, size_t *parsed_len, size_t *n_parsed // if start of data to parse was found, but not the end, then finish here // set parsed_len, so that the beginning of that data is at the beginning of the stream if (earliest_data && earliest_length == -1) { - *parsed_len = earliest_data - stream->data; + *parsed_len = earliest_data - (byte_t *)stream->bytes.data; return parsed_data; } // if data to parse was found, parse it and update the offset if (earliest_data) { ParsedData new_parsed = earliest_parse_fun(earliest_data, earliest_length); - parsed_data = array_append(parsed_data, sizeof(ParsedData), n_parsed_data, &parsed_data_capacity, &new_parsed); - stream_offset = earliest_data - stream->data + earliest_length; + array_append(&parsed_data, &new_parsed); + stream_offset = earliest_data - (byte_t *)stream->bytes.data + earliest_length; } } while (earliest_data); // if all was parsed - set parsed_len to stream_len and return the data - *parsed_len = stream->len; + *parsed_len = stream->bytes.count; return parsed_data; } - -void free_parsed_data(ParsedData *parsed_data, size_t n_parsed_data) { - for (size_t i = 0; i < n_parsed_data; i++) { - if (parsed_data[i].data_cleanup) - parsed_data[i].data_cleanup(parsed_data[i].data); - free(parsed_data[i].data); - } - free(parsed_data); -} |
