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 c...@case.edu http://cnswww.cns.cwru.edu/~chet/