]> granicus.if.org Git - icinga2/commitdiff
Bugfix: Loading state files was broken.
authorGunnar Beutner <gunnar.beutner@netways.de>
Wed, 30 Jan 2013 09:52:52 +0000 (10:52 +0100)
committerGunnar Beutner <gunnar.beutner@netways.de>
Wed, 30 Jan 2013 09:53:06 +0000 (10:53 +0100)
Fixes #3562

lib/base/dynamicobject.cpp
lib/base/netstring.cpp

index a7803eeeab8b8b1ee9aebbbd2b50e89b66726e31..807c316263c78452cb2bb5c49db7a8ddbcba92d0 100644 (file)
@@ -390,6 +390,8 @@ void DynamicObject::RestoreObjects(const String& filename)
        StdioStream::Ptr sfp = boost::make_shared<StdioStream>(&fp, false);
        sfp->Start();
 
+       unsigned long restored = 0;
+
        String message;
        while (NetString::ReadStringFromStream(sfp, &message)) {
                Dictionary::Ptr persistentObject = Value::Deserialize(message);
@@ -413,9 +415,15 @@ void DynamicObject::RestoreObjects(const String& filename)
                } else if (object) {
                        object->ApplyUpdate(update, Attribute_All);
                }
+
+               restored++;
        }
 
        sfp->Close();
+
+       stringstream msgbuf;
+       msgbuf << "Restored " << restored << " objects";
+       Logger::Write(LogInformation, "base", msgbuf.str());
 }
 
 void DynamicObject::DeactivateObjects(void)
index 3522cad99cb8f46f10ba843e82e23fdb5e445c12..c3264d178f54f66f0516e0e75e6b9718f4306dc3 100644 (file)
@@ -32,24 +32,17 @@ using namespace icinga;
  */
 bool NetString::ReadStringFromStream(const Stream::Ptr& stream, String *str)
 {
-       size_t buffer_length = stream->GetAvailableBytes();
-
-       /* minimum netString length is 3 */
-       if (buffer_length < 3)
-               return false;
-
-       /* limit the number of bytes we're reading for the header */
-       if (buffer_length > 16)
-               buffer_length = 16;
-
+       /* 16 bytes are enough for the header */
+       size_t peek_length, buffer_length = 16;
        char *buffer = static_cast<char *>(malloc(buffer_length));
 
-       if (buffer == NULL && buffer_length > 0)
+       if (buffer == NULL)
                throw_exception(bad_alloc());
 
-       buffer_length = stream->Peek(buffer, buffer_length);
+       peek_length = stream->Peek(buffer, buffer_length);
 
-       if (buffer_length < 3) {
+       /* minimum netString length is 3 */
+       if (peek_length < 3) {
                free(buffer);
                return false;
        }
@@ -63,7 +56,7 @@ bool NetString::ReadStringFromStream(const Stream::Ptr& stream, String *str)
        size_t len, i;
 
        len = 0;
-       for (i = 0; i < buffer_length && isdigit(buffer[i]); i++) {
+       for (i = 0; i < peek_length && isdigit(buffer[i]); i++) {
                /* length specifier must have at most 9 characters */
                if (i >= 9) {
                        free(buffer);
@@ -73,13 +66,7 @@ bool NetString::ReadStringFromStream(const Stream::Ptr& stream, String *str)
                len = len * 10 + (buffer[i] - '0');
        }
 
-       buffer_length = stream->GetAvailableBytes();
-
-       /* make sure the buffer is large enough */
-       if (i + len + 1 >= buffer_length)
-               return false;
-
-       /* limit the number of bytes we're reading to this message */
+       /* read the whole message */
        buffer_length = i + 1 + len + 1;
 
        char *new_buffer = static_cast<char *>(realloc(buffer, buffer_length));
@@ -91,7 +78,10 @@ bool NetString::ReadStringFromStream(const Stream::Ptr& stream, String *str)
 
        buffer = new_buffer;
 
-       stream->Peek(buffer, buffer_length);
+       peek_length = stream->Peek(buffer, buffer_length);
+
+       if (peek_length < buffer_length)
+               return false;
 
        /* check for the colon delimiter */
        if (buffer[i] != ':') {
@@ -110,7 +100,7 @@ bool NetString::ReadStringFromStream(const Stream::Ptr& stream, String *str)
        free(buffer);
 
        /* remove the data from the stream */
-       stream->Read(NULL, buffer_length);
+       stream->Read(NULL, peek_length);
 
        return true;
 }