I built cssc from source to get the debug symbols and valgrind shows:

valgrind cssc-1.4.1/src/get  s.xxxx_xxxxxxxxx-xx
==319086== Memcheck, a memory error detector
==319086== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==319086== Using Valgrind-3.16.1 and LibVEX; rerun with -h for copyright info
==319086== Command: cssc-1.4.1/src/get s.xxxx_xxxxxxxxx-xx
==319086==
==319086== Invalid read of size 1
==319086==    at 0x483BC82: strlen (vg_replace_strmem.c:459)
==319086==    by 0x4AC5F34: fputs (iofputs.c:33)
==319086==    by 0x111B59: sccs_file::write_subst(char const*, 
sccs_file::subst_parms*, delta const&, bool) const (writesubst.cc:113)
==319086==    by 0x111CED: sccs_file::write_subst(char const*, 
sccs_file::subst_parms*, delta const&, bool) const (writesubst.cc:245)
==319086==    by 0x110BFD: sccs_file::get(std::__cxx11::basic_string<char, std::char_traits<char>, 
std::allocator<char> > const&, seq_state&, sccs_file::subst_parms&, bool, int, int, int, 
bool, bool) (sf-get.cc:416)
==319086==    by 0x10FAAA: sccs_file::get(_IO_FILE*, std::__cxx11::basic_string<char, 
std::char_traits<char>, std::allocator<char> > const&, _IO_FILE*, sid, sccs_date, 
range_list<sid>, range_list<sid>, int, char const*, int, int, int, bool) (sf-get2.cc:519)
==319086==    by 0x10C88B: main (get.cc:463)
==319086==  Address 0x4d75c80 is 0 bytes inside a block of size 18 free'd
==319086==    at 0x483A08B: operator delete(void*, unsigned long) 
(vg_replace_malloc.c:593)
==319086==    by 0x111B4B: deallocate (new_allocator.h:133)
==319086==    by 0x111B4B: deallocate (alloc_traits.h:492)
==319086==    by 0x111B4B: _M_destroy (basic_string.h:237)
==319086==    by 0x111B4B: _M_dispose (basic_string.h:232)
==319086==    by 0x111B4B: ~basic_string (basic_string.h:658)
==319086==    by 0x111B4B: sccs_file::write_subst(char const*, 
sccs_file::subst_parms*, delta const&, bool) const (writesubst.cc:112)
==319086==    by 0x111CED: sccs_file::write_subst(char const*, 
sccs_file::subst_parms*, delta const&, bool) const (writesubst.cc:245)
==319086==    by 0x110BFD: sccs_file::get(std::__cxx11::basic_string<char, std::char_traits<char>, 
std::allocator<char> > const&, seq_state&, sccs_file::subst_parms&, bool, int, int, int, 
bool, bool) (sf-get.cc:416)
==319086==    by 0x10FAAA: sccs_file::get(_IO_FILE*, std::__cxx11::basic_string<char, 
std::char_traits<char>, std::allocator<char> > const&, _IO_FILE*, sid, sccs_date, 
range_list<sid>, range_list<sid>, int, char const*, int, int, int, bool) (sf-get2.cc:519)
==319086==    by 0x10C88B: main (get.cc:463)
==319086==  Block was alloc'd at
==319086==    at 0x4838DEF: operator new(unsigned long) 
(vg_replace_malloc.c:342)
==319086==    by 0x11297C: void std::__cxx11::basic_string<char, std::char_traits<char>, 
std::allocator<char> >::_M_construct<char*>(char*, char*, std::forward_iterator_tag) 
[clone .isra.0] (basic_string.tcc:219)
==319086==    by 0x113301: _M_construct_aux<char*> (basic_string.h:247)
==319086==    by 0x113301: _M_construct<char*> (basic_string.h:266)
==319086==    by 0x113301: basic_string (basic_string.h:451)
==319086==    by 0x113301: gfile (sccsname.h:87)
==319086==    by 0x113301: sccs_file::get_module_name[abi:cxx11]() const 
(sccsfile.cc:694)
==319086==    by 0x111B2B: sccs_file::write_subst(char const*, 
sccs_file::subst_parms*, delta const&, bool) const (writesubst.cc:112)
==319086==    by 0x111CED: sccs_file::write_subst(char const*, 
sccs_file::subst_parms*, delta const&, bool) const (writesubst.cc:245)
==319086==    by 0x110BFD: sccs_file::get(std::__cxx11::basic_string<char, std::char_traits<char>, 
std::allocator<char> > const&, seq_state&, sccs_file::subst_parms&, bool, int, int, int, 
bool, bool) (sf-get.cc:416)
==319086==    by 0x10FAAA: sccs_file::get(_IO_FILE*, std::__cxx11::basic_string<char, 
std::char_traits<char>, std::allocator<char> > const&, _IO_FILE*, sid, sccs_date, 
range_list<sid>, range_list<sid>, int, char const*, int, int, int, bool) (sf-get2.cc:519)
==319086==    by 0x10C88B: main (get.cc:463)
==319086==

So this patch fixes the problem:

--- src/writesubst.cc.orig      2019-05-07 13:40:13.000000000 +0200
+++ src/writesubst.cc   2021-11-05 14:26:23.229149292 +0100
@@ -109,8 +109,8 @@
case 'M':
               {
-                const char *mod = get_module_name().c_str();
-                err = fputs_failed(fputs(mod, out));
+                string mod = get_module_name();
+                err = fputs_failed(fputs(mod.c_str(), out));
               }
             break;

Reply via email to