Change IP_Hdr copy ctor/assign to explicit method

Addresses BIT-1298
This commit is contained in:
Jon Siwek 2014-12-12 14:14:24 -06:00
parent c211a2c91a
commit d31b556b85
3 changed files with 14 additions and 46 deletions

View file

@ -4,8 +4,6 @@
#include "Type.h" #include "Type.h"
#include "Val.h" #include "Val.h"
#include "Var.h" #include "Var.h"
#include <algorithm>
#include <utility>
static RecordType* ip4_hdr_type = 0; static RecordType* ip4_hdr_type = 0;
static RecordType* ip6_hdr_type = 0; static RecordType* ip6_hdr_type = 0;
@ -639,32 +637,20 @@ VectorVal* IPv6_Hdr_Chain::BuildVal() const
return rval; return rval;
} }
IP_Hdr::IP_Hdr(const IP_Hdr& other) IP_Hdr* IP_Hdr::Copy() const
{ {
del = true; char* new_hdr = new char[HdrLen()];
if ( other.ip4 ) if ( ip4 )
{ {
char* new_hdr = new char[other.HdrLen()]; memcpy(new_hdr, ip4, HdrLen());
memcpy(new_hdr, other.ip4, other.HdrLen()); return new IP_Hdr((const struct ip*) new_hdr, true);
ip4 = (const struct ip*)new_hdr;
ip6 = 0;
ip6_hdrs = 0;
} }
else
{
ip4 = 0;
char* new_hdr = new char[other.HdrLen()];
memcpy(new_hdr, other.ip6, other.HdrLen());
ip6 = (const struct ip6_hdr*)new_hdr;
ip6_hdrs = other.ip6_hdrs->Copy(ip6);
}
}
IP_Hdr& IP_Hdr::operator=(IP_Hdr other) memcpy(new_hdr, ip6, HdrLen());
{ const struct ip6_hdr* new_ip6 = (const struct ip6_hdr*)new_hdr;
swap(*this, other); IPv6_Hdr_Chain* new_ip6_hdrs = ip6_hdrs->Copy(new_ip6);
return *this; return new IP_Hdr(new_ip6, true, 0, new_ip6_hdrs);
} }
IPv6_Hdr_Chain* IPv6_Hdr_Chain::Copy(const ip6_hdr* new_hdr) const IPv6_Hdr_Chain* IPv6_Hdr_Chain::Copy(const ip6_hdr* new_hdr) const
@ -698,12 +684,3 @@ IPv6_Hdr_Chain* IPv6_Hdr_Chain::Copy(const ip6_hdr* new_hdr) const
return rval; return rval;
} }
void swap(IP_Hdr& a, IP_Hdr& b)
{
using std::swap;
swap(a.ip4, b.ip4);
swap(a.ip6, b.ip6);
swap(a.del, b.del);
swap(a.ip6_hdrs, b.ip6_hdrs);
}

View file

@ -368,18 +368,11 @@ public:
} }
/** /**
* Copy constructor. The internal buffer of \a other which contains * Copy a header. The internal buffer which contains the header data
* the header data must not be truncated. Also not that if that buffer * must not be truncated. Also note that if that buffer points to a full
* points to a full packet payload, only the IP header portion is copied. * packet payload, only the IP header portion is copied.
*/ */
IP_Hdr(const IP_Hdr& other); IP_Hdr* Copy() const;
/**
* Copy assignment. The internal buffer of \a other which contains
* the header data must not be truncated. Also not that if that buffer
* points to a full packet payload, only the IP header portion is copied.
*/
IP_Hdr& operator=(IP_Hdr other);
/** /**
* Destructor. * Destructor.
@ -581,8 +574,6 @@ public:
*/ */
RecordVal* BuildPktHdrVal() const; RecordVal* BuildPktHdrVal() const;
friend void swap(IP_Hdr& a, IP_Hdr& b);
private: private:
const struct ip* ip4; const struct ip* ip4;

View file

@ -43,7 +43,7 @@ void PIA::AddToBuffer(Buffer* buffer, uint64 seq, int len, const u_char* data,
} }
DataBlock* b = new DataBlock; DataBlock* b = new DataBlock;
b->ip = ip ? new IP_Hdr(*ip) : 0; b->ip = ip ? ip->Copy() : 0;
b->data = tmp; b->data = tmp;
b->is_orig = is_orig; b->is_orig = is_orig;
b->len = len; b->len = len;