[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: bash leaks a pointer
From: |
Chet Ramey |
Subject: |
Re: bash leaks a pointer |
Date: |
Wed, 15 Jul 2015 10:18:50 -0400 |
User-agent: |
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:31.0) Gecko/20100101 Thunderbird/31.7.0 |
On 7/15/15 4:29 AM, Ondrej Oprala wrote:
> $ export LC_ALL=en_US.UTF-8
> $ valgrind --leak-check=full /bin/bash -c 'exit 0'
> #<snip>
> ==4190== HEAP SUMMARY:
> ==4190== in use at exit: 22,269 bytes in 614 blocks
> ==4190== total heap usage: 698 allocs, 84 frees, 29,706 bytes allocated
> ==4190==
> ==4190== 12 bytes in 1 blocks are definitely lost in loss record 77 of 218
> ==4190== at 0x4C28C10: malloc (in
> /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
> ==4190== by 0x18928F: xmalloc (in /usr/bin/bash)
> ==4190== by 0x18306A: set_default_locale (in /usr/bin/bash)
> ==4190== by 0x1360B0: main (in /usr/bin/bash)
> ==4190==
> #</snip>
>
> set_default_locale leaks a pointer (alloced by savestring()) if LC_ALL is
> non-empty. Currently, I don't
> see the "default_locale" var used anywhere in the code base, the only
> ocurrence is in a "#if 0" directive.
Bash keeps a `clean' copy of the default locale for its own purposes. The
return value of setlocale() is not well defined: the string it returns may
or may not be allocated with malloc. Posix says you can't count on it
remaining unmodified across subsequent calls to setlocale(). To avoid
problems with pointers to freed memory, bash has to make a copy of the
default locale in a newly-allocated string. If setlocale() uses malloc to
allocate the pointer it returns, that can be a leak, but there's no good
way to determine that.
--
``The lyf so short, the craft so long to lerne.'' - Chaucer
``Ars longa, vita brevis'' - Hippocrates
Chet Ramey, ITS, CWRU chet@case.edu http://cnswww.cns.cwru.edu/~chet/