From: Josh Date: Wed, 24 Sep 2014 18:02:58 +0000 (-0400) Subject: fixing PacketManager::encode_new() valgrind bug X-Git-Tag: 3.0.0-233~1398^2~15^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=97061b3c5f5a35d4d4f1ac4e68f19959557bc6cc;p=thirdparty%2Fsnort3.git fixing PacketManager::encode_new() valgrind bug --- diff --git a/src/main/snort.cc b/src/main/snort.cc index 441a8666d..2bd8fade5 100644 --- a/src/main/snort.cc +++ b/src/main/snort.cc @@ -913,7 +913,7 @@ void snort_thread_init(const char* intf) DAQ_New(snort_conf, intf); DAQ_Start(); - s_packet = PacketManager::encode_new(); + s_packet = PacketManager::encode_new(false); CodecManager::thread_init(); FileAPIPostInit(); diff --git a/src/protocols/packet_manager.cc b/src/protocols/packet_manager.cc index 60554bd88..6724d19fb 100644 --- a/src/protocols/packet_manager.cc +++ b/src/protocols/packet_manager.cc @@ -101,21 +101,33 @@ static inline void push_layer(Packet *p, // Initialization and setup //------------------------------------------------------------------------- -Packet* PacketManager::encode_new() +Packet* PacketManager::encode_new(bool packet_data) { Packet* p = (Packet*)SnortAlloc(sizeof(*p)); - uint8_t* b = (uint8_t*)SnortAlloc(sizeof(*p->pkth) + Codec::PKT_MAX + SPARC_TWIDDLE); Layer* lyr = new Layer[CodecManager::max_layers]; - if ( !p || !b || !lyr) + if ( !p || !lyr) FatalError("encode_new() => Failed to allocate packet\n"); - p->pkth = (DAQ_PktHdr_t*)b; - b += sizeof(*p->pkth); - b += SPARC_TWIDDLE; - p->pkt = b; - p->layers = lyr; + if (!packet_data) + { + p->pkt = nullptr; + p->pkth = nullptr; + } + else + { + uint8_t* b = (uint8_t*)SnortAlloc(sizeof(*p->pkth) + Codec::PKT_MAX + SPARC_TWIDDLE); + + if (!b) + FatalError("encode_new() => Failed to allocate packet\n"); + p->pkth = (DAQ_PktHdr_t*)b; + b += sizeof(*p->pkth); + b += SPARC_TWIDDLE; + p->pkt = b; + } + + p->layers = lyr; return p; } @@ -124,7 +136,7 @@ void PacketManager::encode_delete(Packet* p) if (p) { if(p->pkth) - free((void*)p->pkth); // cast away const! + free((void*)p->pkth); if(p->layers) delete[] p->layers; diff --git a/src/protocols/packet_manager.h b/src/protocols/packet_manager.h index bf1828096..d42f288d1 100644 --- a/src/protocols/packet_manager.h +++ b/src/protocols/packet_manager.h @@ -62,7 +62,7 @@ public: static void decode(Packet*, const struct _daq_pkthdr*, const uint8_t*); // allocate a Packet for later formatting (cloning) - static Packet* encode_new(void); + static Packet* encode_new(bool allocate_packet_data = true); // release the allocated Packet static void encode_delete(Packet*);