summaryrefslogtreecommitdiff
path: root/plainPacket.cpp
diff options
context:
space:
mode:
authorChristian Pointner <equinox@anytun.org>2008-03-03 17:59:57 +0000
committerChristian Pointner <equinox@anytun.org>2008-03-03 17:59:57 +0000
commit30dbbc65bd3684b9cefa000069b611a608f4be3e (patch)
tree68614a0ccd2a68c3fcd90b5a7652f798f795d50e /plainPacket.cpp
parentadded showtable (diff)
some bugfixes
added support for authentication
Diffstat (limited to 'plainPacket.cpp')
-rw-r--r--plainPacket.cpp17
1 files changed, 13 insertions, 4 deletions
diff --git a/plainPacket.cpp b/plainPacket.cpp
index f9c43ae..c1fd99a 100644
--- a/plainPacket.cpp
+++ b/plainPacket.cpp
@@ -61,6 +61,9 @@ void PlainPacket::setPayloadType(payload_type_t payload_type)
u_int32_t PlainPacket::getPayloadLength() const
{
+ if(!payload_)
+ return 0;
+
return (length_ > sizeof(payload_type_t)) ? (length_ - sizeof(payload_type_t)) : 0;
}
@@ -73,9 +76,17 @@ void PlainPacket::setPayloadLength(u_int32_t payload_length)
void PlainPacket::reinit()
{
- Buffer::reinit();
payload_type_ = reinterpret_cast<payload_type_t*>(buf_);
payload_ = buf_ + sizeof(payload_type_t);
+
+ if(length_ <= (sizeof(payload_type_t)))
+ payload_ = NULL;
+
+ if(length_ < (sizeof(payload_type_t))) {
+ payload_type_ = NULL;
+ throw std::runtime_error("packet can't be initialized, buffer is too small");
+ }
+
}
u_int8_t* PlainPacket::getPayload()
@@ -83,7 +94,6 @@ u_int8_t* PlainPacket::getPayload()
return payload_;
}
-
NetworkAddress PlainPacket::getSrcAddr() const
{
if(!payload_type_ || !payload_)
@@ -108,12 +118,11 @@ NetworkAddress PlainPacket::getSrcAddr() const
if(length_ < (sizeof(payload_type_t)+sizeof(struct ip6_hdr)))
return NetworkAddress();
struct ip6_hdr* hdr = reinterpret_cast<struct ip6_hdr*>(payload_);
- return NetworkAddress(hdr->ip6_dst);
+ return NetworkAddress(hdr->ip6_src);
}
return NetworkAddress();
}
-
NetworkAddress PlainPacket::getDstAddr() const
{
if(!payload_type_ || !payload_)