return tx;
}
-int SMTPProcessDataChunk(const uint8_t *chunk, uint32_t len,
- MimeDecParseState *state) {
+/** \internal
+ * \brief update inspected tracker if it gets to far behind
+ *
+ * As smtp uses the FILE_USE_DETECT flag in the file API, we are responsible
+ * for making sure that File::content_inspected is not getting too far
+ * behind.
+ */
+static void SMTPPruneFiles(FileContainer *files)
+{
+ SCLogDebug("cfg: win %"PRIu32" min_size %"PRIu32,
+ smtp_config.content_inspect_window, smtp_config.content_inspect_min_size);
+
+ File *file = files->head;
+ while (file) {
+ if (file->chunks_head) {
+ uint32_t window = smtp_config.content_inspect_window;
+ if (file->chunks_head->stream_offset == 0)
+ window = MAX(window, smtp_config.content_inspect_min_size);
+
+ uint64_t file_size = file->content_len_so_far;
+ uint64_t data_size = file_size - file->chunks_head->stream_offset;
+
+ SCLogDebug("window %"PRIu32", file_size %"PRIu64", data_size %"PRIu64,
+ window, file_size, data_size);
+
+ if (data_size > (window * 3)) {
+ uint64_t left_edge = file_size - window;
+ SCLogDebug("file->content_inspected now %"PRIu64, left_edge);
+ file->content_inspected = left_edge;
+ }
+ }
+
+ file = file->next;
+ }
+}
+int SMTPProcessDataChunk(const uint8_t *chunk, uint32_t len,
+ MimeDecParseState *state)
+{
+ SCEnter();
int ret = MIME_DEC_OK;
Flow *flow = (Flow *) state->data;
SMTPState *smtp_state = (SMTPState *) flow->alstate;
}
if (FileOpenFile(files, (uint8_t *) entity->filename, entity->filename_len,
- (uint8_t *) chunk, len, flags) == NULL) {
+ (uint8_t *) chunk, len, flags|FILE_USE_DETECT) == NULL) {
ret = MIME_DEC_ERR_DATA;
SCLogDebug("FileOpenFile() failed");
}
}
if (files != NULL) {
+ SMTPPruneFiles(files);
FilePrune(files);
}