]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
file: clean up file flags handling
authorVictor Julien <vjulien@oisf.net>
Fri, 10 Jun 2022 06:01:15 +0000 (08:01 +0200)
committerVictor Julien <vjulien@oisf.net>
Fri, 30 Sep 2022 07:46:05 +0000 (09:46 +0200)
src/flow.h
src/util-file.c
src/util-file.h

index 8bbe6e600aad5ed48bd8ea7e46636a8a36c61e58..a4ecf78358d1c7ec3a929c96890e186387ff6c52 100644 (file)
@@ -139,6 +139,9 @@ typedef struct AppLayerParserState_ AppLayerParserState;
 #define FLOWFILE_NO_SIZE_TS             BIT_U16(10)
 #define FLOWFILE_NO_SIZE_TC             BIT_U16(11)
 
+/** store all files in the flow */
+#define FLOWFILE_STORE BIT_U16(12)
+
 #define FLOWFILE_NONE_TS (FLOWFILE_NO_MAGIC_TS | \
                           FLOWFILE_NO_STORE_TS | \
                           FLOWFILE_NO_MD5_TS   | \
index ce291feb68fdcd1f65ea0d79ea4b5492ca7f6dea..fec4771763b7a4b521afd7cc4bc8f331b20d3b54 100644 (file)
@@ -230,54 +230,65 @@ void FileForceHashParseCfg(ConfNode *conf)
     }
 }
 
-uint16_t FileFlowToFlags(const Flow *flow, uint8_t direction)
+uint16_t FileFlowFlagsToFlags(const uint16_t flow_file_flags, uint8_t direction)
 {
     uint16_t flags = 0;
 
     if (direction == STREAM_TOSERVER) {
-        if (flow->file_flags & FLOWFILE_NO_STORE_TS) {
+        if ((flow_file_flags & (FLOWFILE_NO_STORE_TS | FLOWFILE_STORE)) == FLOWFILE_NO_STORE_TS) {
             flags |= FILE_NOSTORE;
         }
 
-        if (flow->file_flags & FLOWFILE_NO_MAGIC_TS) {
+        if (flow_file_flags & FLOWFILE_NO_MAGIC_TS) {
             flags |= FILE_NOMAGIC;
         }
 
-        if (flow->file_flags & FLOWFILE_NO_MD5_TS) {
+        if (flow_file_flags & FLOWFILE_NO_MD5_TS) {
             flags |= FILE_NOMD5;
         }
 
-        if (flow->file_flags & FLOWFILE_NO_SHA1_TS) {
+        if (flow_file_flags & FLOWFILE_NO_SHA1_TS) {
             flags |= FILE_NOSHA1;
         }
 
-        if (flow->file_flags & FLOWFILE_NO_SHA256_TS) {
+        if (flow_file_flags & FLOWFILE_NO_SHA256_TS) {
             flags |= FILE_NOSHA256;
         }
     } else {
-        if (flow->file_flags & FLOWFILE_NO_STORE_TC) {
+        if ((flow_file_flags & (FLOWFILE_NO_STORE_TC | FLOWFILE_STORE)) == FLOWFILE_NO_STORE_TC) {
             flags |= FILE_NOSTORE;
         }
 
-        if (flow->file_flags & FLOWFILE_NO_MAGIC_TC) {
+        if (flow_file_flags & FLOWFILE_NO_MAGIC_TC) {
             flags |= FILE_NOMAGIC;
         }
 
-        if (flow->file_flags & FLOWFILE_NO_MD5_TC) {
+        if (flow_file_flags & FLOWFILE_NO_MD5_TC) {
             flags |= FILE_NOMD5;
         }
 
-        if (flow->file_flags & FLOWFILE_NO_SHA1_TC) {
+        if (flow_file_flags & FLOWFILE_NO_SHA1_TC) {
             flags |= FILE_NOSHA1;
         }
 
-        if (flow->file_flags & FLOWFILE_NO_SHA256_TC) {
+        if (flow_file_flags & FLOWFILE_NO_SHA256_TC) {
             flags |= FILE_NOSHA256;
         }
     }
+    if (flow_file_flags & FLOWFILE_STORE) {
+        flags |= FILE_STORE;
+    }
+    DEBUG_VALIDATE_BUG_ON((flags & (FILE_STORE | FILE_NOSTORE)) == (FILE_STORE | FILE_NOSTORE));
+
+    SCLogDebug("direction %02x flags %02x", direction, flags);
     return flags;
 }
 
+uint16_t FileFlowToFlags(const Flow *flow, uint8_t direction)
+{
+    return FileFlowFlagsToFlags(flow->file_flags, direction);
+}
+
 static int FileMagicSize(void)
 {
     /** \todo make this size configurable */
index b633030690a98f4436a02e0e7f9ae91c0db84c46..3f1cbed9d4e934cffd9c1d20741cc9cb03f2364c 100644 (file)
@@ -251,6 +251,7 @@ void FileTruncateAllOpenFiles(FileContainer *);
 uint64_t FileDataSize(const File *file);
 uint64_t FileTrackedSize(const File *file);
 
+uint16_t FileFlowFlagsToFlags(const uint16_t flow_file_flags, uint8_t direction);
 uint16_t FileFlowToFlags(const Flow *flow, uint8_t direction);
 
 #ifdef DEBUG