Hi Folks,

the root cause of the problem is that

static char rrd_error[MAXLEN] = "\0";
static char rrd_liberror[ERRBUFLEN] = "\0";

creates a nice long array but then points it to a rather short string.

I suggest to merge the follwoing patch.

yes the +10 is not really necessary.

Index: rrd_not_thread_safe.c
===================================================================
--- rrd_not_thread_safe.c       (revision 860)
+++ rrd_not_thread_safe.c       (revision 955)
@@ -1,5 +1,5 @@
 /*****************************************************************************
- * RRDtool 1.2.15  Copyright by Tobi Oetiker, 1997-2006
+ * RRDtool 1.2.16  Copyright by Tobi Oetiker, 1997-2006
  * This file:     Copyright 2003 Peter Stamfest <[EMAIL PROTECTED]>
  *                             & Tobias Oetiker
  * Distributed under the GPL
@@ -14,20 +14,26 @@
 #define MAXLEN 4096
 #define ERRBUFLEN 256

-static char rrd_error[MAXLEN] = "\0";
-static char rrd_liberror[ERRBUFLEN] = "\0";
+static char rrd_error[MAXLEN+10];
+static char rrd_liberror[ERRBUFLEN+10];
+static int  rrd_context_init = 0;
 /* The global context is very useful in the transition period to even
    more thread-safe stuff, it can be used whereever we need a context
    and do not need to worry about concurrency. */
 static struct rrd_context global_ctx = {
-    sizeof(rrd_error),
-    sizeof(rrd_liberror),
+    MAXLEN,
+    ERRBUFLEN,
     rrd_error,
     rrd_liberror
 };
-#include <stdarg.h>
+/* #include <stdarg.h> */

-struct rrd_context *rrd_get_context() {
+struct rrd_context *rrd_get_context(void) {
+    if (! rrd_context_init ){
+       rrd_context_init = 1;
+        global_ctx.rrd_error[0]='\0';
+        global_ctx.lib_errstr[0]='\0';
+    }
     return &global_ctx;
 }

cheers
tobi

-- 
Tobi Oetiker, OETIKER+PARTNER AG, Aarweg 15 CH-4600 Olten
http://it.oetiker.ch [EMAIL PROTECTED] ++41 62 213 9902



-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to