mirror of
https://github.com/zeek/zeek.git
synced 2025-10-05 08:08:19 +00:00
Change {Get,Set}ContentsFile() to use IntrusivePtr
This commit is contained in:
parent
599eec297c
commit
0f5bb4b83d
9 changed files with 31 additions and 41 deletions
|
@ -912,12 +912,12 @@ void TransportLayerAnalyzer::Done()
|
||||||
}
|
}
|
||||||
|
|
||||||
void TransportLayerAnalyzer::SetContentsFile(unsigned int /* direction */,
|
void TransportLayerAnalyzer::SetContentsFile(unsigned int /* direction */,
|
||||||
BroFile* /* f */)
|
IntrusivePtr<BroFile> /* f */)
|
||||||
{
|
{
|
||||||
reporter->Error("analyzer type does not support writing to a contents file");
|
reporter->Error("analyzer type does not support writing to a contents file");
|
||||||
}
|
}
|
||||||
|
|
||||||
BroFile* TransportLayerAnalyzer::GetContentsFile(unsigned int /* direction */) const
|
IntrusivePtr<BroFile> TransportLayerAnalyzer::GetContentsFile(unsigned int /* direction */) const
|
||||||
{
|
{
|
||||||
reporter->Error("analyzer type does not support writing to a contents file");
|
reporter->Error("analyzer type does not support writing to a contents file");
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
|
@ -911,7 +911,7 @@ public:
|
||||||
* @param f The file to record to.
|
* @param f The file to record to.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
virtual void SetContentsFile(unsigned int direction, BroFile* f);
|
virtual void SetContentsFile(unsigned int direction, IntrusivePtr<BroFile> f);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns an associated contents file, if any. This must only be
|
* Returns an associated contents file, if any. This must only be
|
||||||
|
@ -921,7 +921,7 @@ public:
|
||||||
* @param direction One of the CONTENTS_* constants indicating which
|
* @param direction One of the CONTENTS_* constants indicating which
|
||||||
* direction the query is for.
|
* direction the query is for.
|
||||||
*/
|
*/
|
||||||
virtual BroFile* GetContentsFile(unsigned int direction) const;
|
virtual IntrusivePtr<BroFile> GetContentsFile(unsigned int direction) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Associates a PIA with this analyzer. A PIA takes the
|
* Associates a PIA with this analyzer. A PIA takes the
|
||||||
|
|
|
@ -1584,7 +1584,7 @@ void TCP_Analyzer::ConnDeleteTimer(double t)
|
||||||
Conn()->DeleteTimer(t);
|
Conn()->DeleteTimer(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TCP_Analyzer::SetContentsFile(unsigned int direction, BroFile* f)
|
void TCP_Analyzer::SetContentsFile(unsigned int direction, IntrusivePtr<BroFile> f)
|
||||||
{
|
{
|
||||||
if ( direction == CONTENTS_NONE )
|
if ( direction == CONTENTS_NONE )
|
||||||
{
|
{
|
||||||
|
@ -1601,7 +1601,7 @@ void TCP_Analyzer::SetContentsFile(unsigned int direction, BroFile* f)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
BroFile* TCP_Analyzer::GetContentsFile(unsigned int direction) const
|
IntrusivePtr<BroFile> TCP_Analyzer::GetContentsFile(unsigned int direction) const
|
||||||
{
|
{
|
||||||
switch ( direction ) {
|
switch ( direction ) {
|
||||||
case CONTENTS_NONE:
|
case CONTENTS_NONE:
|
||||||
|
|
|
@ -60,8 +60,8 @@ public:
|
||||||
// the test is whether it has any outstanding, un-acked data.
|
// the test is whether it has any outstanding, un-acked data.
|
||||||
bool DataPending(TCP_Endpoint* closing_endp);
|
bool DataPending(TCP_Endpoint* closing_endp);
|
||||||
|
|
||||||
void SetContentsFile(unsigned int direction, BroFile* f) override;
|
void SetContentsFile(unsigned int direction, IntrusivePtr<BroFile> f) override;
|
||||||
BroFile* GetContentsFile(unsigned int direction) const override;
|
IntrusivePtr<BroFile> GetContentsFile(unsigned int direction) const override;
|
||||||
|
|
||||||
// From Analyzer.h
|
// From Analyzer.h
|
||||||
void UpdateConnVal(RecordVal *conn_val) override;
|
void UpdateConnVal(RecordVal *conn_val) override;
|
||||||
|
|
|
@ -29,7 +29,6 @@ TCP_Endpoint::TCP_Endpoint(TCP_Analyzer* arg_analyzer, bool arg_is_orig)
|
||||||
FIN_seq = 0;
|
FIN_seq = 0;
|
||||||
SYN_cnt = FIN_cnt = RST_cnt = 0;
|
SYN_cnt = FIN_cnt = RST_cnt = 0;
|
||||||
did_close = false;
|
did_close = false;
|
||||||
contents_file = nullptr;
|
|
||||||
tcp_analyzer = arg_analyzer;
|
tcp_analyzer = arg_analyzer;
|
||||||
is_orig = arg_is_orig;
|
is_orig = arg_is_orig;
|
||||||
|
|
||||||
|
@ -53,7 +52,6 @@ TCP_Endpoint::TCP_Endpoint(TCP_Analyzer* arg_analyzer, bool arg_is_orig)
|
||||||
TCP_Endpoint::~TCP_Endpoint()
|
TCP_Endpoint::~TCP_Endpoint()
|
||||||
{
|
{
|
||||||
delete contents_processor;
|
delete contents_processor;
|
||||||
Unref(contents_file);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Connection* TCP_Endpoint::Conn() const
|
Connection* TCP_Endpoint::Conn() const
|
||||||
|
@ -254,10 +252,9 @@ void TCP_Endpoint::AckReceived(uint64_t seq)
|
||||||
contents_processor->AckReceived(seq);
|
contents_processor->AckReceived(seq);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TCP_Endpoint::SetContentsFile(BroFile* f)
|
void TCP_Endpoint::SetContentsFile(IntrusivePtr<BroFile> f)
|
||||||
{
|
{
|
||||||
Ref(f);
|
contents_file = std::move(f);
|
||||||
contents_file = f;
|
|
||||||
contents_start_seq = ToRelativeSeqSpace(last_seq, seq_wraps);
|
contents_start_seq = ToRelativeSeqSpace(last_seq, seq_wraps);
|
||||||
|
|
||||||
if ( contents_start_seq == 0 )
|
if ( contents_start_seq == 0 )
|
||||||
|
|
|
@ -3,8 +3,8 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "IPAddr.h"
|
#include "IPAddr.h"
|
||||||
|
#include "File.h"
|
||||||
|
|
||||||
class BroFile;
|
|
||||||
class Connection;
|
class Connection;
|
||||||
class IP_Hdr;
|
class IP_Hdr;
|
||||||
|
|
||||||
|
@ -187,8 +187,8 @@ public:
|
||||||
|
|
||||||
void AckReceived(uint64_t seq);
|
void AckReceived(uint64_t seq);
|
||||||
|
|
||||||
void SetContentsFile(BroFile* f);
|
void SetContentsFile(IntrusivePtr<BroFile> f);
|
||||||
BroFile* GetContentsFile() const { return contents_file; }
|
const IntrusivePtr<BroFile>& GetContentsFile() const { return contents_file; }
|
||||||
|
|
||||||
// Codes used for tracking history. For responders, we shift these
|
// Codes used for tracking history. For responders, we shift these
|
||||||
// over by 16 bits in order to fit both originator and responder
|
// over by 16 bits in order to fit both originator and responder
|
||||||
|
@ -211,7 +211,7 @@ public:
|
||||||
TCP_Endpoint* peer;
|
TCP_Endpoint* peer;
|
||||||
TCP_Reassembler* contents_processor;
|
TCP_Reassembler* contents_processor;
|
||||||
TCP_Analyzer* tcp_analyzer;
|
TCP_Analyzer* tcp_analyzer;
|
||||||
BroFile* contents_file;
|
IntrusivePtr<BroFile> contents_file;
|
||||||
uint32_t checksum_base;
|
uint32_t checksum_base;
|
||||||
|
|
||||||
double start_time, last_time;
|
double start_time, last_time;
|
||||||
|
|
|
@ -30,7 +30,6 @@ TCP_Reassembler::TCP_Reassembler(analyzer::Analyzer* arg_dst_analyzer,
|
||||||
type = arg_type;
|
type = arg_type;
|
||||||
endp = arg_endp;
|
endp = arg_endp;
|
||||||
had_gap = false;
|
had_gap = false;
|
||||||
record_contents_file = nullptr;
|
|
||||||
deliver_tcp_contents = false;
|
deliver_tcp_contents = false;
|
||||||
skip_deliveries = false;
|
skip_deliveries = false;
|
||||||
did_EOF = false;
|
did_EOF = false;
|
||||||
|
@ -58,11 +57,6 @@ TCP_Reassembler::TCP_Reassembler(analyzer::Analyzer* arg_dst_analyzer,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TCP_Reassembler::~TCP_Reassembler()
|
|
||||||
{
|
|
||||||
Unref(record_contents_file);
|
|
||||||
}
|
|
||||||
|
|
||||||
void TCP_Reassembler::Done()
|
void TCP_Reassembler::Done()
|
||||||
{
|
{
|
||||||
MatchUndelivered(-1, true);
|
MatchUndelivered(-1, true);
|
||||||
|
@ -98,7 +92,7 @@ uint64_t TCP_Reassembler::NumUndeliveredBytes() const
|
||||||
return last_block.upper - last_reassem_seq;
|
return last_block.upper - last_reassem_seq;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TCP_Reassembler::SetContentsFile(BroFile* f)
|
void TCP_Reassembler::SetContentsFile(IntrusivePtr<BroFile> f)
|
||||||
{
|
{
|
||||||
if ( ! f->IsOpen() )
|
if ( ! f->IsOpen() )
|
||||||
{
|
{
|
||||||
|
@ -107,16 +101,17 @@ void TCP_Reassembler::SetContentsFile(BroFile* f)
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( record_contents_file )
|
if ( record_contents_file )
|
||||||
|
{
|
||||||
// We were already recording, no need to catch up.
|
// We were already recording, no need to catch up.
|
||||||
Unref(record_contents_file);
|
record_contents_file = nullptr;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if ( ! block_list.Empty() )
|
if ( ! block_list.Empty() )
|
||||||
RecordToSeq(block_list.Begin()->second.seq, last_reassem_seq, f);
|
RecordToSeq(block_list.Begin()->second.seq, last_reassem_seq, f);
|
||||||
}
|
}
|
||||||
|
|
||||||
Ref(f);
|
record_contents_file = std::move(f);
|
||||||
record_contents_file = f;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool is_clean(const TCP_Endpoint* a)
|
static inline bool is_clean(const TCP_Endpoint* a)
|
||||||
|
@ -322,7 +317,7 @@ void TCP_Reassembler::MatchUndelivered(uint64_t up_to_seq, bool use_last_upper)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TCP_Reassembler::RecordToSeq(uint64_t start_seq, uint64_t stop_seq, BroFile* f)
|
void TCP_Reassembler::RecordToSeq(uint64_t start_seq, uint64_t stop_seq, const IntrusivePtr<BroFile>& f)
|
||||||
{
|
{
|
||||||
auto it = block_list.Begin();
|
auto it = block_list.Begin();
|
||||||
|
|
||||||
|
@ -353,7 +348,7 @@ void TCP_Reassembler::RecordToSeq(uint64_t start_seq, uint64_t stop_seq, BroFile
|
||||||
RecordGap(last_seq, stop_seq, f);
|
RecordGap(last_seq, stop_seq, f);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TCP_Reassembler::RecordBlock(const DataBlock& b, BroFile* f)
|
void TCP_Reassembler::RecordBlock(const DataBlock& b, const IntrusivePtr<BroFile>& f)
|
||||||
{
|
{
|
||||||
if ( f->Write((const char*) b.block, b.Size()) )
|
if ( f->Write((const char*) b.block, b.Size()) )
|
||||||
return;
|
return;
|
||||||
|
@ -368,7 +363,7 @@ void TCP_Reassembler::RecordBlock(const DataBlock& b, BroFile* f)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TCP_Reassembler::RecordGap(uint64_t start_seq, uint64_t upper_seq, BroFile* f)
|
void TCP_Reassembler::RecordGap(uint64_t start_seq, uint64_t upper_seq, const IntrusivePtr<BroFile>& f)
|
||||||
{
|
{
|
||||||
if ( f->Write(fmt("\n<<gap %" PRIu64">>\n", upper_seq - start_seq)) )
|
if ( f->Write(fmt("\n<<gap %" PRIu64">>\n", upper_seq - start_seq)) )
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -3,8 +3,8 @@
|
||||||
#include "Reassem.h"
|
#include "Reassem.h"
|
||||||
#include "TCP_Endpoint.h"
|
#include "TCP_Endpoint.h"
|
||||||
#include "TCP_Flags.h"
|
#include "TCP_Flags.h"
|
||||||
|
#include "File.h"
|
||||||
|
|
||||||
class BroFile;
|
|
||||||
class Connection;
|
class Connection;
|
||||||
|
|
||||||
namespace analyzer {
|
namespace analyzer {
|
||||||
|
@ -25,8 +25,6 @@ public:
|
||||||
TCP_Reassembler(Analyzer* arg_dst_analyzer, TCP_Analyzer* arg_tcp_analyzer,
|
TCP_Reassembler(Analyzer* arg_dst_analyzer, TCP_Analyzer* arg_tcp_analyzer,
|
||||||
Type arg_type, TCP_Endpoint* arg_endp);
|
Type arg_type, TCP_Endpoint* arg_endp);
|
||||||
|
|
||||||
~TCP_Reassembler() override;
|
|
||||||
|
|
||||||
void Done();
|
void Done();
|
||||||
|
|
||||||
void SetDstAnalyzer(Analyzer* analyzer) { dst_analyzer = analyzer; }
|
void SetDstAnalyzer(Analyzer* analyzer) { dst_analyzer = analyzer; }
|
||||||
|
@ -51,8 +49,8 @@ public:
|
||||||
// from waiting_on_hole above; and is computed in a different fashion).
|
// from waiting_on_hole above; and is computed in a different fashion).
|
||||||
uint64_t NumUndeliveredBytes() const;
|
uint64_t NumUndeliveredBytes() const;
|
||||||
|
|
||||||
void SetContentsFile(BroFile* f);
|
void SetContentsFile(IntrusivePtr<BroFile> f);
|
||||||
BroFile* GetContentsFile() const { return record_contents_file; }
|
const IntrusivePtr<BroFile>& GetContentsFile() const { return record_contents_file; }
|
||||||
|
|
||||||
void MatchUndelivered(uint64_t up_to_seq, bool use_last_upper);
|
void MatchUndelivered(uint64_t up_to_seq, bool use_last_upper);
|
||||||
|
|
||||||
|
@ -91,9 +89,9 @@ private:
|
||||||
void Undelivered(uint64_t up_to_seq) override;
|
void Undelivered(uint64_t up_to_seq) override;
|
||||||
void Gap(uint64_t seq, uint64_t len);
|
void Gap(uint64_t seq, uint64_t len);
|
||||||
|
|
||||||
void RecordToSeq(uint64_t start_seq, uint64_t stop_seq, BroFile* f);
|
void RecordToSeq(uint64_t start_seq, uint64_t stop_seq, const IntrusivePtr<BroFile>& f);
|
||||||
void RecordBlock(const DataBlock& b, BroFile* f);
|
void RecordBlock(const DataBlock& b, const IntrusivePtr<BroFile>& f);
|
||||||
void RecordGap(uint64_t start_seq, uint64_t upper_seq, BroFile* f);
|
void RecordGap(uint64_t start_seq, uint64_t upper_seq, const IntrusivePtr<BroFile>& f);
|
||||||
|
|
||||||
void BlockInserted(DataBlockMap::const_iterator it) override;
|
void BlockInserted(DataBlockMap::const_iterator it) override;
|
||||||
void Overlap(const u_char* b1, const u_char* b2, uint64_t n) override;
|
void Overlap(const u_char* b1, const u_char* b2, uint64_t n) override;
|
||||||
|
@ -110,7 +108,7 @@ private:
|
||||||
bool in_delivery;
|
bool in_delivery;
|
||||||
analyzer::tcp::TCP_Flags flags;
|
analyzer::tcp::TCP_Flags flags;
|
||||||
|
|
||||||
BroFile* record_contents_file; // file on which to reassemble contents
|
IntrusivePtr<BroFile> record_contents_file; // file on which to reassemble contents
|
||||||
|
|
||||||
Analyzer* dst_analyzer;
|
Analyzer* dst_analyzer;
|
||||||
TCP_Analyzer* tcp_analyzer;
|
TCP_Analyzer* tcp_analyzer;
|
||||||
|
|
|
@ -101,7 +101,7 @@ function set_contents_file%(cid: conn_id, direction: count, f: file%): bool
|
||||||
if ( ! c )
|
if ( ! c )
|
||||||
return val_mgr->False();
|
return val_mgr->False();
|
||||||
|
|
||||||
c->GetRootAnalyzer()->SetContentsFile(direction, f);
|
c->GetRootAnalyzer()->SetContentsFile(direction, {NewRef{}, f});
|
||||||
return val_mgr->True();
|
return val_mgr->True();
|
||||||
%}
|
%}
|
||||||
|
|
||||||
|
@ -127,7 +127,7 @@ function get_contents_file%(cid: conn_id, direction: count%): file
|
||||||
auto cf = c->GetRootAnalyzer()->GetContentsFile(direction);
|
auto cf = c->GetRootAnalyzer()->GetContentsFile(direction);
|
||||||
|
|
||||||
if ( cf )
|
if ( cf )
|
||||||
return make_intrusive<Val>(IntrusivePtr{NewRef{}, cf});
|
return make_intrusive<Val>(std::move(cf));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return some sort of error value.
|
// Return some sort of error value.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue