Hi Matthias, yes you are right ... we fixed this in master, but not in the 1.4 branch ... it is now ...
cheers tobi Today Matthias Nagel wrote: > Hello, > > I am writing a multi-threaded C++ application that uses rrdlib natively by > calling rrd_update_r(). If I compile without optimazations and enable -ggdb > everything seems to work fine. As soon as I switch to -O2 and disable -ggdb > my apllication crashes at runtime. > > If it crashes the output is either > > *** glibc detected *** rrdtool: <something> > > or > > expected timestamp not found in data source from <input> > > but <input> is not the string that was given to rrd_update_r but unreadable > garbage. Obviously, it is a memory corruption problem. Therefore, I ran the > application under valgrind and I noticed that the problems comes from inside > of the rrdlib. The message is > > > ==11724== Invalid read of size 1 > ==11724== at 0x4C2A051: __GI_strcmp (mc_replace_strmem.c:712) > ==11724== by 0x5A4FF7F: setlocale (setlocale.c:210) > ==11724== by 0x505D06B: _rrd_update (rrd_update.c:982) > ==11724== Address 0x9deb0d0 is 0 bytes inside a block of size 12 free'd > ==11724== at 0x4C27D4E: free (vg_replace_malloc.c:427) > ==11724== by 0x5A4FCBD: setname (setlocale.c:173) > ==11724== by 0x5A500B0: setlocale (setlocale.c:417) > ==11724== by 0x505D02D: _rrd_update (rrd_update.c:974) > > Let's have a look at it: > > rrd_update.c:973: old_locale = setlocale(LC_NUMERIC, NULL); > rrd_update.c:974: setlocale(LC_NUMERIC, "C"); > rrd_update.c:982: setlocale(LC_NUMERIC, old_locale); > > The problem is obvious. The variable "old_locale" that is used at the 3rd > line was assigned at the 1st line. But the 2nd call to "setlocale" freed the > return value of the first call. According to the man pages the return value > is a pointer to static memory and freed/allocated on every call. Actually the > 2nd line (974) should be ommited and it should be > > rrd_update.c:973: old_locale = setlocale(LC_NUMERIC, "C" ); > rrd_update.c:974: // deleted > rrd_update.c:982: setlocale(LC_NUMERIC, old_locale); > > Why this double call to "setlocale" anyway? > > Best regards, Matthias > > -- Tobi Oetiker, OETIKER+PARTNER AG, Aarweg 15 CH-4600 Olten, Switzerland www.oetiker.ch [email protected] +41 62 775 9902 _______________________________________________ rrd-users mailing list [email protected] https://lists.oetiker.ch/cgi-bin/listinfo/rrd-users
