[rrd-users] Valgrind error rrd_update.c:982
Tobias Oetiker
tobi at oetiker.ch
Sun Jun 15 22:37:01 CEST 2014
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 tobi at oetiker.ch +41 62 775 9902
More information about the rrd-users
mailing list