}
}
+size_t str_to_hash(const uint8_t *str, int length )
+{
+ size_t a,b,c,tmp;
+ int i,j,k,m;
+ a = b = c = 0;
+ for (i = 0, j = 0; i < length; i += 4)
+ {
+ tmp = 0;
+ k = length - i;
+ if (k > 4)
+ k=4;
+
+ for (m = 0; m < k; m++)
+ {
+ tmp |= *(str + i + m) << m*8;
+ }
+
+ switch (j)
+ {
+ case 0:
+ a += tmp;
+ break;
+ case 1:
+ b += tmp;
+ break;
+ case 2:
+ c += tmp;
+ break;
+ }
+ j++;
+
+ if (j == 3)
+ {
+ mix(a,b,c);
+ j = 0;
+ }
+ }
+
+ finalize(a,b,c);
+ return c;
+}
+
// n == 0 => strlen(s)
const char* s, unsigned n = 0);
+SO_PUBLIC size_t str_to_hash(const uint8_t *str, int length);
+
struct SFHASHFCN
{
unsigned seed;
void B64Decode::reset_decode_state()
{
reset_decoded_bytes();
- buffer->reset();
+ buffer->reset_saved();
}
DecodeResult B64Decode::decode_data(const uint8_t* start, const uint8_t* end)
act_encode_size = act_encode_size - i;
buffer->save_buffer(buffer->get_encode_buff() + act_encode_size, i);
}
+ else
+ buffer->reset_saved();
if (sf_base64decode(buffer->get_encode_buff(), act_encode_size,
buffer->get_decode_buff(), buffer->get_decode_avail(), &act_decode_size) != 0)
#include "decode_buffer.h"
#include "utils/util.h"
-void DecodeBuffer::reset()
+void DecodeBuffer::reset_saved()
{
prev_encoded_bytes = 0;
prev_encoded_buf = nullptr;
// Move forward buffer pointer
void update_buffer(uint32_t act_encode_size, uint32_t act_decode_size);
- void reset();
+ void reset_saved();
uint8_t* get_decode_buff() { return decodeBuf; }
uint8_t* get_encode_buff() { return encodeBuf; }
uint32_t get_decode_bytes_read() { return decode_bytes_read; }
void QPDecode::reset_decode_state()
{
reset_decoded_bytes();
- buffer->reset();
+ buffer->reset_saved();
}
DecodeResult QPDecode::decode_data(const uint8_t* start, const uint8_t* end)
buffer->save_buffer(buffer->get_encode_buff() + bytes_read, (act_encode_size - bytes_read));
act_encode_size = bytes_read;
}
+ else
+ buffer->reset_saved();
decoded_bytes = act_decode_size;
decodePtr = buffer->get_decode_buff();
reset_decoded_bytes();
if (buffer)
- buffer->reset();
+ buffer->reset_saved();
begin_found = end_found = false;
}
buffer->save_buffer(buffer->get_encode_buff() + bytes_read, (act_encode_size - bytes_read));
act_encode_size = bytes_read;
}
+ else
+ buffer->reset_saved();
decoded_bytes = act_decode_size;
decodePtr = buffer->get_decode_buff();
initFilePosition(&data_ssn->position, get_file_processed_size(p->flow));
finalFilePosition(&data_ssn->position);
- Stream::flush_request(p);
-
- if (!(data_ssn->packet_flags & FTPDATA_FLG_STOP))
- {
- data_ssn->packet_flags |= FTPDATA_FLG_STOP;
- FTPDataProcess(p, data_ssn, (uint8_t*)p->data, p->dsize);
- }
}
//-------------------------------------------------------------------------
FileFlows* file_flows = FileFlows::get_file_flows(flow);
const bool download = (source_id == SRC_SERVER);
+ HttpMsgRequest* request = transaction->get_request();
+
+ size_t file_index = 0;
+
+ if ((request != nullptr) and (request->get_http_uri() != nullptr))
+ {
+ file_index = request->get_http_uri()->get_file_proc_hash();
+ }
+
if (file_flows->file_process(file_data.start, fp_length,
- file_position, !download))
+ file_position, !download, file_index))
{
session_data->file_depth_remaining[source_id] -= fp_length;
// With the first piece of the file we must provide the "name" which means URI
if (front)
{
- HttpMsgRequest* request = transaction->get_request();
if (request != nullptr)
{
const Field& tranaction_uri = request->get_uri_norm_classic();
#include "file_api/file_flows.h"
#include "http_enum.h"
#include "http_field.h"
+#include "http_msg_request.h"
#include "http_test_manager.h"
#include "http_test_input.h"
#include "http_cutter.h"
{
FileFlows* file_flows = FileFlows::get_file_flows(flow);
const bool download = (source_id == SRC_SERVER);
- file_flows->file_process(nullptr, 0, SNORT_FILE_END, !download);
+
+ size_t file_index = 0;
+
+ if (session_data->transaction[source_id] != nullptr)
+ {
+ HttpMsgRequest* request = session_data->transaction[source_id]->get_request();
+ if ((request != nullptr) and (request->get_http_uri() != nullptr))
+ {
+ file_index = request->get_http_uri()->get_file_proc_hash();
+ }
+ }
+
+ file_flows->file_process(nullptr, 0, SNORT_FILE_END, !download, file_index);
}
else
{
#include "http_module.h"
#include "http_uri.h"
+#include "hash/sfhashfcn.h"
+
using namespace HttpEnums;
HttpUri::~HttpUri()
classic_norm_allocated = true;
}
+size_t HttpUri::get_file_proc_hash()
+{
+ if (abs_path_hash)
+ return abs_path_hash;
+
+ if (abs_path.length > 0 )
+ {
+ abs_path_hash = str_to_hash(abs_path.start, abs_path.length);
+ }
+
+ return abs_path_hash;
+}
const Field& get_norm_query() { return query_norm; }
const Field& get_norm_fragment() { return fragment_norm; }
const Field& get_norm_classic() { return classic_norm; }
+ size_t get_file_proc_hash();
private:
const Field uri;
Field fragment_norm;
Field classic_norm;
bool classic_norm_allocated = false;
+ size_t abs_path_hash = 0;
void normalize();
void parse_uri();