return Analyzer::get_switcher()->get_next()->buf;
}
-DataBuffer& DetectionEngine::get_alt_buffer(Packet* p)
-{
- assert(p);
- return p->context->alt_data;
-}
-
void DetectionEngine::set_file_data(const DataPointer& dp)
{
auto c = Analyzer::get_switcher()->get_context();
static const DataPointer& get_file_data(const IpsContext*, uint64_t& id, bool& drop_sse, bool& no_sse);
static uint8_t* get_buffer(unsigned& max);
- static struct DataBuffer& get_alt_buffer(Packet*);
+ static inline DataPointer get_alt_buffer(const Packet*);
+ static inline DataBuffer& acquire_alt_buffer(const Packet*);
+ static inline void reset_alt_buffer(Packet*);
static void set_data(unsigned id, IpsContextData*);
static IpsContextData* get_data(unsigned id);
IpsContext* context;
};
+DataPointer DetectionEngine::get_alt_buffer(const Packet* p)
+{
+ assert(p);
+ auto& alt_buf = p->context->alt_data;
+
+ return { alt_buf.data, alt_buf.len };
+}
+
+DataBuffer& DetectionEngine::acquire_alt_buffer(const Packet* p)
+{
+ assert(p);
+
+ auto& alt_buf = p->context->alt_data;
+
+ if (!alt_buf.data)
+ alt_buf.allocate_data();
+
+ return alt_buf;
+}
+
+void snort::DetectionEngine::reset_alt_buffer(Packet *p)
+{ p->context->alt_data.len = 0; }
+
static inline void set_file_data(const uint8_t* p, unsigned n)
{
DataPointer dp { p, n };
// this is a legacy junk-drawer file that needs to be refactored
// it provides file and alt data and event trace foo.
+#include <cassert>
+
#include "actions/actions.h"
#include "main/snort_config.h"
struct DataBuffer
{
- uint8_t data[DECODE_BLEN];
- unsigned len;
+ static constexpr unsigned decode_blen = DECODE_BLEN;
+
+ DataBuffer() = default;
+ DataBuffer(const DataBuffer&) = delete;
+ DataBuffer& operator=(const DataBuffer&) = delete;
+ ~DataBuffer()
+ { delete [] data; }
+
+ void allocate_data()
+ {
+ assert(nullptr == data);
+ const_cast<uint8_t*&>(data) = new uint8_t[DECODE_BLEN];
+ }
+
+ uint8_t* const data = nullptr;
+ unsigned len = 0;
};
struct MatchedBuffer
{
// need to add a norm_data keyword or telnet, rpc_decode, smtp keywords
// until then we must use the standard packet mpse
- const DataBuffer& buf = DetectionEngine::get_alt_buffer(p);
+ const DataPointer& buf = DetectionEngine::get_alt_buffer(p);
if ( buf.len )
{
{
if (p->flow and p->flow->gadget)
{
- const DataBuffer& alt_buf = DetectionEngine::get_alt_buffer(p);
-
+ const DataPointer& alt_buf = DetectionEngine::get_alt_buffer(p);
if (alt_buf.len)
{
set("alt_data", alt_buf.data, alt_buf.len);
{
// cppcheck-suppress unreadVariable
RuleProfile profile(base64PerfStats);
- DataBuffer& base64_decode_buffer = DetectionEngine::get_alt_buffer(p);
+ DataBuffer& base64_decode_buffer = DetectionEngine::acquire_alt_buffer(p);
base64_decode_buffer.len = 0;
Base64DecodeData* idx = (Base64DecodeData*)&config;
}
if (sf_base64decode(base64_buf, base64_size, base64_decode_buffer.data,
- sizeof(base64_decode_buffer.data), &base64_decode_buffer.len) != 0)
+ base64_decode_buffer.decode_blen, &base64_decode_buffer.len) != 0)
return NO_MATCH;
return MATCH;
{
// cppcheck-suppress unreadVariable
RuleProfile profile(base64PerfStats);
- const DataBuffer& base64_decode_buffer = DetectionEngine::get_alt_buffer(p);
+ const DataPointer& base64_decode_buffer = DetectionEngine::get_alt_buffer(p);
if ( !base64_decode_buffer.len )
return NO_MATCH;
else if ( log_pkt )
ObfuscateLogNetData(fast_log, p->data, p->dsize, p, nullptr, "pkt_data", ins_name);
- DataBuffer& buf = DetectionEngine::get_alt_buffer(p);
+ const DataPointer& buf = DetectionEngine::get_alt_buffer(p);
if ( buf.len and event.sig_info->gid != 116 )
LogNetData(fast_log, buf.data, buf.len, p, "alt");
static void make_port_scan_info(Packet* p, PS_PROTO* proto)
{
- DataBuffer& buf = DetectionEngine::get_alt_buffer(p);
+ DataBuffer& buf = DetectionEngine::acquire_alt_buffer(p);
SfIp* ip1 = &proto->low_ip;
SfIp* ip2 = &proto->high_ip;
else
type = 'r';
- buf.len = safe_snprintf((char*)buf.data, sizeof(buf.data),
+ buf.len = safe_snprintf((char*)buf.data, buf.decode_blen,
"Priority Count: %d\n"
"Connection Count: %d\n"
"IP Count: %d\n"
static void make_open_port_info(Packet* p, PS_PROTO* proto)
{
- DataBuffer& buf = DetectionEngine::get_alt_buffer(p);
+ DataBuffer& buf = DetectionEngine::acquire_alt_buffer(p);
SfIp* ip1 = &proto->low_ip;
char a1[INET6_ADDRSTRLEN];
ip1->ntop(a1, sizeof(a1));
- buf.len += safe_snprintf((char*)buf.data+buf.len, sizeof(buf.data)-buf.len,
+ buf.len += safe_snprintf((char*)buf.data + buf.len, buf.decode_blen - buf.len,
"Scanned IP: %s\n"
"Port Count: %d\n"
"Open Ports:",
for ( int i = 0; i < proto->open_ports_cnt; i++ )
{
buf.len += safe_snprintf(
- (char*)buf.data + buf.len, sizeof(buf.data) - buf.len, " %hu", proto->open_ports[i]);
+ (char*)buf.data + buf.len, buf.decode_blen - buf.len, " %hu", proto->open_ports[i]);
}
- buf.len += safe_snprintf((char*)buf.data + buf.len, sizeof(buf.data) - buf.len, "\n");
+ buf.len += safe_snprintf((char*)buf.data + buf.len, buf.decode_blen - buf.len, "\n");
}
#if 0
// FIXIT-L add open port for port sweeps
static void make_open_port_info(Packet* p, uint16_t port)
{
- DataBuffer& buf = DetectionEngine::get_alt_buffer(p);
+ DataBuffer& buf = DetectionEngine::acquire_alt_buffer(p);
SfIpString ip_str;
- buf.len = safe_snprintf((char*)buf.data, sizeof(buf.data),
+ buf.len = safe_snprintf((char*)buf.data, buf.decode_blen,
"Scanned IP: %s\n"
"Open Port: %hu\n",
p->ptrs.ip_api.get_src()->ntop(ip_str), port);
(iMode == FTPP_SI_SERVER_MODE && session->server_conf->ignore_telnet_erase_cmds))
ignoreTelnetErase = FTPP_IGNORE_TNC_ERASE_CMDS;
- DataBuffer& buf = DetectionEngine::get_alt_buffer(p);
+ DataBuffer& buf = DetectionEngine::acquire_alt_buffer(p);
iRet = normalize_telnet(nullptr, p, buf, iMode, ignoreTelnetErase, true);
const unsigned char* end = p->data + p->dsize;
- const DataBuffer& buf = DetectionEngine::get_alt_buffer(p);
+ const DataPointer& buf = DetectionEngine::get_alt_buffer(p);
if ( buf.len )
end = buf.data + buf.len;
void reset_telnet_buffer(Packet* p)
{
- DetectionEngine::get_alt_buffer(p).len = 0;
+ DetectionEngine::reset_alt_buffer(p);
}
int normalize_telnet(
/* walk thru the remainder of the packet */
while ((read_ptr < end) &&
- (write_ptr < ((unsigned char*)buf.data) + sizeof(buf.data)))
+ (write_ptr < ((unsigned char*)buf.data) + buf.decode_blen))
{
/* if the following byte isn't a subnegotiation initialization */
if (((read_ptr + 1) < end) &&
if ( telnet_config->normalize )
{
- DataBuffer& buf = DetectionEngine::get_alt_buffer(p);
+ DataBuffer& buf = DetectionEngine::acquire_alt_buffer(p);
int ret = normalize_telnet(Telnetsession, p, buf, iInspectMode,
FTPP_APPLY_TNC_ERASE_CMDS, false);
static RpcStatus RpcPrepRaw(const uint8_t* data, uint32_t fraglen, Packet* p)
{
- DataBuffer& buf = DetectionEngine::get_alt_buffer(p);
+ DataBuffer& buf = DetectionEngine::acquire_alt_buffer(p);
- if (RPC_FRAG_HDR_SIZE + fraglen > sizeof(buf.data))
+ if (RPC_FRAG_HDR_SIZE + fraglen > buf.decode_blen)
return RPC_STATUS__ERROR;
- memcpy_s(buf.data, sizeof(buf.data), data, RPC_FRAG_HDR_SIZE + fraglen);
+ memcpy_s(buf.data, buf.decode_blen, data, RPC_FRAG_HDR_SIZE + fraglen);
buf.len = (RPC_FRAG_HDR_SIZE + fraglen);
return RPC_STATUS__SUCCESS;
static RpcStatus RpcPrepFrag(RpcSsnData* rsdata, Packet* p)
{
- DataBuffer& buf = DetectionEngine::get_alt_buffer(p);
+ DataBuffer& buf = DetectionEngine::acquire_alt_buffer(p);
uint32_t fraghdr = htonl(RpcBufLen(&rsdata->frag));
buf.data[0] = *((uint8_t*)&fraghdr);
buf.data[0] |= 0x80;
- if (RpcBufLen(&rsdata->frag) > sizeof(buf.data) - 4)
+ if (RpcBufLen(&rsdata->frag) > buf.decode_blen - 4)
{
RpcBufClean(&rsdata->frag);
return RPC_STATUS__ERROR;
}
- memcpy_s(buf.data + 4, sizeof(buf.data) - 4,
+ memcpy_s(buf.data + 4, buf.decode_blen - 4,
RpcBufData(&rsdata->frag), RpcBufLen(&rsdata->frag));
if (RpcBufLen(&rsdata->frag) > RPC_MAX_BUF_SIZE)
static RpcStatus RpcPrepSeg(RpcSsnData* rsdata, Packet* p)
{
- DataBuffer& buf = DetectionEngine::get_alt_buffer(p);
+ DataBuffer& buf = DetectionEngine::acquire_alt_buffer(p);
- if (RpcBufLen(&rsdata->seg) > sizeof(buf.data))
+ if (RpcBufLen(&rsdata->seg) > buf.decode_blen)
{
RpcBufClean(&rsdata->seg);
return RPC_STATUS__ERROR;
}
- memcpy_s(buf.data, sizeof(buf.data),
+ memcpy_s(buf.data, buf.decode_blen,
RpcBufData(&rsdata->seg), RpcBufLen(&rsdata->seg));
if (RpcBufLen(&rsdata->seg) > RPC_MAX_BUF_SIZE)
uint32_t fraghdr; /* Used to store the RPC fragment header data */
int fragcount = 0; /* How many fragment counters have we seen? */
- DataBuffer& buf = DetectionEngine::get_alt_buffer(p);
- size_t decode_buf_rem = sizeof(buf.data);
+ DataBuffer& buf = DetectionEngine::acquire_alt_buffer(p);
+ size_t decode_buf_rem = buf.decode_blen;
if (psize < MIN_CALL_BODY_SZ)
{
void RpcDecode::clear(Packet* p)
{
- DataBuffer& buf = DetectionEngine::get_alt_buffer(p);
- buf.len = 0;
+ DetectionEngine::reset_alt_buffer(p);
}
//-------------------------------------------------------------------------
void SMTP_ResetAltBuffer(Packet* p)
{
- DataBuffer& buf = DetectionEngine::get_alt_buffer(p);
- buf.len = 0;
+ DetectionEngine::reset_alt_buffer(p);
}
const uint8_t* SMTP_GetAltBuffer(Packet* p, unsigned& len)
{
- const DataBuffer& buf = DetectionEngine::get_alt_buffer(p);
+ const DataPointer& buf = DetectionEngine::get_alt_buffer(p);
len = buf.len;
return len ? buf.data : nullptr;
}
if (length == 0)
return 0;
- DataBuffer& buf = DetectionEngine::get_alt_buffer(p);
- unsigned alt_size = sizeof(buf.data);
+ DataBuffer& buf = DetectionEngine::acquire_alt_buffer(p);
+ unsigned alt_size = buf.decode_blen;
if ((unsigned long)length > alt_size - buf.len)
{