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;