X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fyoink;a=blobdiff_plain;f=src%2FMoof%2FPacket.cc;h=bb8fcc7b88bb9a2413526c9a40ab8164b0b7e7e7;hp=842d6c1d9e9406d89dcf488b61b5df6f8b0a8cb1;hb=3fd6f206f0e64122b7cb289907a1a780b6ed2dc9;hpb=2a97ae825077e5b75aee35b1c1ada221a4ae7b26 diff --git a/src/Moof/Packet.cc b/src/Moof/Packet.cc index 842d6c1..bb8fcc7 100644 --- a/src/Moof/Packet.cc +++ b/src/Moof/Packet.cc @@ -100,6 +100,7 @@ Packet::Packet(size_t size) : mSize(size), mR(0), mW(0), + mOriginalW(0), mBoolR(0), mBoolW(0), mBoolNumR(0), @@ -110,12 +111,14 @@ Packet::Packet(const char* data, size_t size) : mSize(size), mR(0), mW(size), + mOriginalW(size), mBoolR(0), mBoolW(0), mBoolNumR(0), mBoolNumW(0) { if (mBuffer) memcpy(mBuffer, data, size); + else throw std::length_error("out of memory"); } @@ -124,12 +127,14 @@ Packet::Packet(const Packet& copy) : mSize(copy.mSize), mR(copy.mR), mW(copy.mW), + mOriginalW(copy.mOriginalW), mBoolR(copy.mBoolR), mBoolW(copy.mBoolW), mBoolNumR(copy.mBoolNumR), mBoolNumW(copy.mBoolNumW) { if (mBuffer) memcpy(mBuffer, copy.mBuffer, mSize); + else throw std::length_error("out of memory"); } Packet& Packet::operator=(const Packet& copy) @@ -140,11 +145,13 @@ Packet& Packet::operator=(const Packet& copy) mSize = copy.mSize; mR = copy.mR; mW = copy.mW; + mOriginalW = copy.mOriginalW; mBoolR = copy.mBoolR; mBoolW = copy.mBoolW; mBoolNumR = copy.mBoolNumR; mBoolNumW = copy.mBoolNumW; if (mBuffer) memcpy(mBuffer, copy.mBuffer, mSize); + else throw std::length_error("out of memory"); return *this; } @@ -163,7 +170,7 @@ Packet& Packet::operator<<(bool value) mBoolW = mW; unsigned char byte = 0; - if (write(&byte, 1) == 0) return *this; + if (write(&byte, 1) == 0) throw std::length_error("out of memory"); } if (value) mBuffer[mBoolW] |= (1 << bit); @@ -196,28 +203,40 @@ Packet& Packet::operator<<(int64_t value) Packet& Packet::operator<<(uint8_t value) { - write(&value, sizeof(value)); + if (write(&value, sizeof(value)) != sizeof(value)) + { + throw std::length_error("out of memory"); + } return *this; } Packet& Packet::operator<<(uint16_t value) { value = htons(value); - write(&value, sizeof(value)); + if (write(&value, sizeof(value)) != sizeof(value)) + { + throw std::length_error("out of memory"); + } return *this; } Packet& Packet::operator<<(uint32_t value) { value = htonl(value); - write(&value, sizeof(value)); + if (write(&value, sizeof(value)) != sizeof(value)) + { + throw std::length_error("out of memory"); + } return *this; } Packet& Packet::operator<<(uint64_t value) { value = htonll(value); - write(&value, sizeof(value)); + if (write(&value, sizeof(value)) != sizeof(value)) + { + throw std::length_error("out of memory"); + } return *this; } @@ -226,7 +245,10 @@ Packet& Packet::operator<<(float value) // XXX: assumes the ieee-754 uint32_t* integer = reinterpret_cast(&value); *integer = htonl(*integer); - write(integer, sizeof(value)); + if (write(integer, sizeof(value)) != sizeof(value)) + { + throw std::length_error("out of memory"); + } return *this; } @@ -235,7 +257,10 @@ Packet& Packet::operator<<(double value) // XXX: assumes the ieee-754 uint64_t* integer = reinterpret_cast(&value); *integer = htonll(*integer); - write(integer, sizeof(value)); + if (write(integer, sizeof(value)) != sizeof(value)) + { + throw std::length_error("out of memory"); + } return *this; } @@ -269,7 +294,7 @@ Packet& Packet::operator>>(bool& value) mBoolR = mR; unsigned char byte = 0; - if (read(&byte, 1) == 0) return *this; + if (read(&byte, 1) == 0) throw std::out_of_range("end of packet"); } value = 1 & (mBuffer[mBoolR] >> bit); @@ -300,27 +325,39 @@ Packet& Packet::operator>>(int64_t& value) Packet& Packet::operator>>(uint8_t& value) { - read(&value, sizeof(value)); + if (read(&value, sizeof(value)) != sizeof(value)) + { + throw std::out_of_range("end of packet"); + } return *this; } Packet& Packet::operator>>(uint16_t& value) { - read(&value, sizeof(value)); + if (read(&value, sizeof(value)) != sizeof(value)) + { + throw std::out_of_range("end of packet"); + } value = ntohs(value); return *this; } Packet& Packet::operator>>(uint32_t& value) { - read(&value, sizeof(value)); + if (read(&value, sizeof(value)) != sizeof(value)) + { + throw std::out_of_range("end of packet"); + } value = ntohl(value); return *this; } Packet& Packet::operator>>(uint64_t& value) { - read(&value, sizeof(value)); + if (read(&value, sizeof(value)) != sizeof(value)) + { + throw std::out_of_range("end of packet"); + } value = ntohll(value); return *this; } @@ -329,7 +366,10 @@ Packet& Packet::operator>>(float& value) { // XXX: assumes the ieee-754 uint32_t* integer = reinterpret_cast(&value); - read(integer, sizeof(value)); + if (read(integer, sizeof(value)) != sizeof(value)) + { + throw std::out_of_range("end of packet"); + } *integer = htonl(*integer); return *this; } @@ -338,7 +378,10 @@ Packet& Packet::operator>>(double& value) { // XXX: assumes the ieee-754 uint64_t* integer = reinterpret_cast(&value); - read(integer, sizeof(value)); + if (read(integer, sizeof(value)) != sizeof(value)) + { + throw std::out_of_range("end of packet"); + } *integer = htonll(*integer); return *this; } @@ -363,5 +406,16 @@ void Packet::clear() } +void Packet::reset() +{ + mR = 0; + mW = mOriginalW; + mBoolR = 0; + mBoolW = 0; + mBoolNumR = 0; + mBoolNumW = 0; +} + + } // namespace Mf