The non-readline branch of Abc_UtilsGetUsersInput has three behavioral
gaps versus the readline branch that break callers driving abc as a
coprocess over a pipe (e.g. yosys's passes/techmap/abc.cc, which spawns
"abc -s" with piped stdin/stdout and uses read_until_abc_done to wait
for "abc NN> <command>" lines):
1. The prompt is written with fprintf() and never flushed. On a pipe
stdout is fully buffered, so the prompt never reaches the reader.
The reader waits for the prompt, abc waits in fgets(), deadlock.
2. There is no echo of the line read from stdin. readline() emits
each character to its output stream; yosys's protocol depends on
seeing "abc NN> source ...\n" in the output to advance state.
Without an echo it waits forever.
3. EOF on stdin is silently ignored: fgets() returns NULL but the
function returns a stale Prompt buffer, causing a tight loop on
pipe close. The readline branch exit(0)s on NULL.
Fix all three. Echo only when stdin is not a tty -- on a tty the kernel
already echoes typed characters during cooked input, so double-echo
would be visible to interactive users.
Signed-off-by: Matt Liberty <mliberty@precisioninno.com>
Get the fixes for CVE-2010-0405 & CVE-2019-12900. I have tried to
preserve the local modifications on top of the base library.
Signed-off-by: Matt Liberty <mliberty@precisioninno.com>
It is a convention inherited from GNU automake to use CPPFLAGS
for compiler flag intended for the preprocessor, while CFLAGS and
and CXXFLAGS provide flags intended for the C and C++ compiler.
Adjust build rules to include CPPFLAGS ensure any preprocessor
flags in build systems using this environment variable work out of
the box.
This allow Debian builds to pass on hardening flags without modifying
the build setup.
Patch from Ruben Undheim via Debian
The buffer length is used in a static array returned from
Extra_FileNameGenericAppend(), used many places in the code, and a
more dynamic approach would require a huge refactoring. There is no
guarantee that the 4096 value picked is large enough, but it matches
common values found on Linux.