src/Network/Buffer.cc
changeset 399 c7295b72731a
parent 380 d193dd1d8a7e
child 417 c503e0c6a740
--- 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);