--- a/src/Network/Buffer.cc Fri Jan 16 01:05:34 2009 +0200
+++ b/src/Network/Buffer.cc Fri Jan 16 21:24:45 2009 +0200
@@ -26,7 +26,8 @@
void NetworkBufferBase::resize (size_t item_size) {
size_t new_size = size;
- // make sure that new_size isn't zero, because zero times two is zero, even if you do that in an infinite loop :)
+ // make sure that new_size isn't zero, because zero times two is zero, even if you try and calculate that in an
+ // infinite loop :)
if (new_size == 0)
new_size = 1;
@@ -36,14 +37,21 @@
// grow if needed
if (new_size != size) {
+ char *temp = buf;
+
// realloc buffer
- if ((buf = (char *) realloc((void *) buf, new_size)) == NULL)
+ if ((buf = (char *) realloc((void *) buf, new_size)) == NULL) {
+ // restore temp, but the buffer may be corrupted now
+ buf = temp;
+
+ // raise error
throw NetworkBufferError("realloc failed");
+ }
// update size
size = new_size;
- } else if (new_size > (offset + item_size) * 4) {
+ } else if (size > (offset + item_size) * 4) {
// XXX: shrink?
}
}
@@ -176,7 +184,8 @@
bool NetworkBufferOutput::write_prefix (char *buf, uint16_t prefix) {
uint16_t nval = htons(prefix);
-
+
+ // XXX: not exception-safe
push_write((char*) &nval, sizeof(uint16_t));
push_write(buf, prefix);
@@ -187,6 +196,7 @@
bool NetworkBufferOutput::write_prefix (char *buf, uint32_t prefix) {
uint32_t nval = htonl(prefix);
+ // XXX: not exception-safe
push_write((char*) &nval, sizeof(uint32_t));
push_write(buf, prefix);