if (file_policy == nullptr)
return;
- FileContext* file = get_file_context(pending_file_id, false);
+ bool is_new_context = false;
+ FileContext* file = get_file_context(pending_file_id, false, is_new_context);
if ((file == nullptr) or (file->verdict != FILE_VERDICT_PENDING))
{
FILE_DEBUG(file_trace, DEFAULT_TRACE_OPTION_ID, TRACE_ERROR_LEVEL, p,
{
if (current_file_id)
{
- return get_file_context(current_file_id, false);
+ bool is_new_context = false;
+ return get_file_context(current_file_id, false, is_new_context);
}
return current_context;
}
}
FileContext* FileFlows::get_file_context(
- uint64_t file_id, bool to_create, uint64_t multi_file_processing_id)
+ uint64_t file_id, bool to_create, bool& is_new_context,
+ uint64_t multi_file_processing_id)
{
+ is_new_context = false;
+
// First check if this file is currently being processed
if (!multi_file_processing_id)
multi_file_processing_id = file_id;
else
{
context = new FileContext;
+ is_new_context = true;
partially_processed_contexts[multi_file_processing_id] = context;
FILE_DEBUG(file_trace, DEFAULT_TRACE_OPTION_ID, TRACE_DEBUG_LEVEL, GET_CURRENT_PACKET,
"get_file_context:creating new context\n");
// Remove file context explicitly
void FileFlows::remove_processed_file_context(uint64_t file_id, uint64_t multi_file_processing_id)
{
+ bool is_new_context = false;
+
if (!multi_file_processing_id)
multi_file_processing_id = file_id;
- FileContext* context = get_file_context(file_id, false, multi_file_processing_id);
+ FileContext* context = get_file_context(file_id, false, is_new_context, multi_file_processing_id);
if (context)
{
set_current_file_context(context);
int64_t file_depth = FileService::get_max_file_depth();
bool continue_processing;
bool cacheable = file_id or offset;
+ bool is_new_context = false;
if (!multi_file_processing_id)
multi_file_processing_id = file_id;
return false;
}
- FileContext* context = get_file_context(file_id, true, multi_file_processing_id);
+ FileContext* context = get_file_context(file_id, true, is_new_context, multi_file_processing_id);
if (!context)
{
context->set_file_id(file_id);
}
- if ( context->is_cacheable())
+ if (context->is_cacheable() and not is_new_context)
{
FileVerdict verdict = FileService::get_file_cache()->cached_verdict_lookup(p, context,
file_policy);
bool FileFlows::set_file_name(const uint8_t* fname, uint32_t name_size, uint64_t file_id,
uint64_t multi_file_processing_id, const uint8_t* url, uint32_t url_size)
{
+ bool is_new_context = false;
FileContext* context;
if (file_id)
- context = get_file_context(file_id, false, multi_file_processing_id);
+ context = get_file_context(file_id, false, is_new_context, multi_file_processing_id);
else
context = get_current_file_context();
if ( !context )