aboutsummaryrefslogtreecommitdiff
path: root/analyzer/parser/parser.c
diff options
context:
space:
mode:
Diffstat (limited to 'analyzer/parser/parser.c')
-rw-r--r--analyzer/parser/parser.c37
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);
-}