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

Reply via email to