[libvirt] [PATCH] logging: fix off-by-one bug

Eric Blake eblake at redhat.com
Sat Mar 19 02:31:22 UTC 2011


Valgrind caught that our log wrap-around was going 1 past the end.
Regression introduced in commit b16f47a; previously the
buffer was static and size+1 bytes, but now it is dynamic and
exactly size bytes.

* src/util/logging.c (virLogStr): Don't write past end of log.
---

An alternative would be to malloc one larger; but since the log
is likely to be a page size multiple and large enough to be worth
malloc using mmap, going one larger is likely to waste the bulk
of a page.  Also, I like always NUL-terminating the current end
of the log (without including that NUL in the log length).

 src/util/logging.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/util/logging.c b/src/util/logging.c
index b972f8a..f4910ad 100644
--- a/src/util/logging.c
+++ b/src/util/logging.c
@@ -326,7 +326,7 @@ static void virLogStr(const char *str, int len) {
         return;
     if (len <= 0)
         len = strlen(str);
-    if (len > virLogSize)
+    if (len >= virLogSize)
         return;
     virLogLock();

@@ -336,13 +336,13 @@ static void virLogStr(const char *str, int len) {
     if (virLogEnd + len >= virLogSize) {
         tmp = virLogSize - virLogEnd;
         memcpy(&virLogBuffer[virLogEnd], str, tmp);
-        virLogBuffer[virLogSize] = 0;
         memcpy(&virLogBuffer[0], &str[tmp], len - tmp);
         virLogEnd = len - tmp;
     } else {
         memcpy(&virLogBuffer[virLogEnd], str, len);
         virLogEnd += len;
     }
+    virLogBuffer[virLogEnd] = 0;
     /*
      * Update the log length, and if full move the start index
      */
-- 
1.7.4




More information about the libvir-list mailing list