From: l0rd
To: bug-bash@gnu.org
Subject: obscure bug "extern void free (void *__ptr) __attribute__
((__nothrow__ , __leaf__));"
Configuration Information [Automatically generated, do not change]:
Machine: x86_64
OS: linux-gnu
Compiler: gcc
Compilation CFLAGS: -march=x86-64 -mtune=generic -O2 -pipe -fno-plt
-DDEFAULT_PATH_VALUE='/usr/local/sbin:/usr/local/bin:/usr/bin'
-DSTANDARD_UTILS_PATH='/usr/bin' -DSYS_BASHRC='/etc/bash.bashrc'
-DSYS_BASH_LOGOUT='/etc/bash.bash_logout' -DNON_INTERACTIVE_LOGIN_SHELLS
uname output: Linux C1MPAQ 5.10.7-arch1-1 #1 SMP PREEMPT Wed, 13 Jan
2021 12:02:01 +0000 x86_64 GNU/Linux
Machine Type: x86_64-pc-linux-gnu
Bash Version: 5.1 (Archlinux: core/bash 5.1.004-1)
Patch Level: 4
Release Status: release
Description:
An Autoconf configure script does fail, because some file it generated
does unexpectedly contain output from some command it called in an
if-statement that had output directed to >& /dev/null . Various
alterations to the script do produce strange outcomes. Sometimes it
avoids the bug, sometimes it will result in the line "extern void free
(void *__ptr) __attribute__ ((__nothrow__ , __leaf__));" to be inserted
into the file in addition to the behavior. This line is seemingly in
some cases also be generated by the command itself that generated the
misplaced output, which suggests that the bug is not in bash but some
API bash is written in.
Repeat-By:
git clone https://github.com/LibreELEC/LibreELEC.tv
cd LibreELEC.tv
ARCH=aarch64 PROJECT=Amlogic DEVICE=AMLGX ./scripts/build linux
-> the build fails after a minute in the Autoconfig step due to
wrongful insertion of silenced command output into file config.status at
line 533
In: build.LibreELEC-AMLGX.aarch64-9.80-devel/build/ccache-3.7.12/configure
Go to line 6532: if diff "$cache_file" confcache >/dev/null 2>&1; then
:; else
Hint: $cache_file is always /dev/null , hence the if-statement will
evaluate false
This diff command is the source of the insertion in
build.LibreELEC-AMLGX.aarch64-9.80-devel/build/ccache-3.7.12/config.status :
0a1,97:
> # This file is a shell script that caches the results of
configure
> # tests run on this system so they can be shared between
configure
...
Remove the line and the corresponding "fi" that closes the if-statement
-> script inserts "extern void free ..." instead into
./config.status at line 533
Replace line with: if diff "$cache_file" confcache >& /tmp/nothing; then
:; else
-> script inserts not only "extern void free ..." in config.status,
but also the following into /tmp/nothing at the top in addition to the
output:
1c1,97
< extern void free (void *__ptr) __attribute__ ((__nothrow__ ,
__leaf__));
---
> # This file is a shell script that caches the results of
configure
...
Replace line with if cat /tmp/nothing >& /dev/null; then :; else
-> script inserts content of /tmp/nothing into ./config.status at
line 533
Replace line with if false; then :; else # or other random commands
-> script works
Content of /tmp/nothing (all characters are exact part of the file):
1c1,97
< extern void free (void *__ptr) __attribute__ ((__nothrow__ , __leaf__));
---
> # This file is a shell script that caches the results of configure
> # tests run on this system so they can be shared between configure
> # scripts and configure runs, see configure's option --config-cache.
> # It is not useful on other systems. If it contains results you don't
> # want to keep, you may remove or edit it.
> #
> # config.status only pays attention to the cache file if you give it
> # the --recheck option to rerun configure.
> #
> # `ac_cv_env_foo' variables (set or unset) will be overridden when
> # loading this file, other *unset* `ac_cv_foo' will be assigned the
> # following values.
>
> ac_cv_build=${ac_cv_build=x86_64-pc-linux-gnu}
> ac_cv_c_bigendian=${ac_cv_c_bigendian=no}
> ac_cv_c_compiler_clang=${ac_cv_c_compiler_clang=no}
> ac_cv_c_compiler_gnu=${ac_cv_c_compiler_gnu=yes}
> ac_cv_c_extern_inline=${ac_cv_c_extern_inline=no}
> ac_cv_c_inline=${ac_cv_c_inline=inline}
> ac_cv_env_CC_set=set
> ac_cv_env_CC_value=/bin/gcc
> ac_cv_env_CFLAGS_set=set
> ac_cv_env_CFLAGS_value='-march=native -O2 -Wall -pipe
-I/home/l0rd/LibreELEC.tv/build.LibreELEC-AMLGX.aarch64-9.80-devel/toolchain/include
-Wno-format-security'
> ac_cv_env_CPPFLAGS_set=set
> ac_cv_env_CPPFLAGS_value=
> ac_cv_env_CPP_set=set
> ac_cv_env_CPP_value=cpp
> ac_cv_env_LDFLAGS_set=set
>
ac_cv_env_LDFLAGS_value='-Wl,-rpath,/home/l0rd/LibreELEC.tv/build.LibreELEC-AMLGX.aarch64-9.80-devel/toolchain/lib
-L/home/l0rd/LibreELEC.tv/build.LibreELEC-AMLGX.aarch64-9.80-devel/toolchain/lib'
> ac_cv_env_LIBS_set=
> ac_cv_env_LIBS_value=
> ac_cv_env_build_alias_set=set
> ac_cv_env_build_alias_value=x86_64-pc-linux-gnu
> ac_cv_env_host_alias_set=set
> ac_cv_env_host_alias_value=x86_64-pc-linux-gnu
> ac_cv_env_target_alias_set=
> ac_cv_env_target_alias_value=
> ac_cv_func_asprintf=${ac_cv_func_asprintf=yes}
> ac_cv_func_gethostname=${ac_cv_func_gethostname=yes}
> ac_cv_func_getopt_long=${ac_cv_func_getopt_long=yes}
> ac_cv_func_getpwuid=${ac_cv_func_getpwuid=yes}
> ac_cv_func_gettimeofday=${ac_cv_func_gettimeofday=yes}
> ac_cv_func_localtime_r=${ac_cv_func_localtime_r=yes}
> ac_cv_func_mkstemp=${ac_cv_func_mkstemp=yes}
> ac_cv_func_realpath=${ac_cv_func_realpath=yes}
> ac_cv_func_setenv=${ac_cv_func_setenv=yes}
> ac_cv_func_snprintf=${ac_cv_func_snprintf=yes}
> ac_cv_func_strndup=${ac_cv_func_strndup=yes}
> ac_cv_func_strtok_r=${ac_cv_func_strtok_r=yes}
> ac_cv_func_unsetenv=${ac_cv_func_unsetenv=yes}
> ac_cv_func_utimes=${ac_cv_func_utimes=yes}
> ac_cv_func_vasprintf=${ac_cv_func_vasprintf=yes}
> ac_cv_func_vsnprintf=${ac_cv_func_vsnprintf=yes}
> ac_cv_header_ctype_h=${ac_cv_header_ctype_h=yes}
> ac_cv_header_dirent_dirent_h=${ac_cv_header_dirent_dirent_h=yes}
> ac_cv_header_inttypes_h=${ac_cv_header_inttypes_h=yes}
> ac_cv_header_memory_h=${ac_cv_header_memory_h=yes}
> ac_cv_header_pwd_h=${ac_cv_header_pwd_h=yes}
> ac_cv_header_stdarg_h=${ac_cv_header_stdarg_h=yes}
> ac_cv_header_stdc=${ac_cv_header_stdc=yes}
> ac_cv_header_stdint_h=${ac_cv_header_stdint_h=yes}
> ac_cv_header_stdlib_h=${ac_cv_header_stdlib_h=yes}
> ac_cv_header_string_h=${ac_cv_header_string_h=yes}
> ac_cv_header_strings_h=${ac_cv_header_strings_h=yes}
> ac_cv_header_sys_mman_h=${ac_cv_header_sys_mman_h=yes}
> ac_cv_header_sys_stat_h=${ac_cv_header_sys_stat_h=yes}
> ac_cv_header_sys_time_h=${ac_cv_header_sys_time_h=yes}
> ac_cv_header_sys_types_h=${ac_cv_header_sys_types_h=yes}
> ac_cv_header_sys_wait_h=${ac_cv_header_sys_wait_h=yes}
> ac_cv_header_termios_h=${ac_cv_header_termios_h=yes}
> ac_cv_header_time=${ac_cv_header_time=yes}
> ac_cv_header_unistd_h=${ac_cv_header_unistd_h=yes}
> ac_cv_header_varargs_h=${ac_cv_header_varargs_h=no}
> ac_cv_host=${ac_cv_host=x86_64-pc-linux-gnu}
> ac_cv_objext=${ac_cv_objext=o}
> ac_cv_path_BASH=${ac_cv_path_BASH=/bin/sh}
> ac_cv_path_EGREP=${ac_cv_path_EGREP='/bin/grep -E'}
> ac_cv_path_GREP=${ac_cv_path_GREP=/bin/grep}
> ac_cv_path_install=${ac_cv_path_install='/bin/install -c'}
> ac_cv_prog_AR=${ac_cv_prog_AR=ar}
> ac_cv_prog_CC=${ac_cv_prog_CC=/bin/gcc}
> ac_cv_prog_CPP=${ac_cv_prog_CPP=cpp}
> ac_cv_prog_RANLIB=${ac_cv_prog_RANLIB=ranlib}
> ac_cv_prog_cc_c89=${ac_cv_prog_cc_c89=}
> ac_cv_prog_cc_c99=${ac_cv_prog_cc_c99=}
> ac_cv_prog_cc_g=${ac_cv_prog_cc_g=yes}
> ac_cv_search_cos=${ac_cv_search_cos=-lm}
> ac_cv_search_opendir=${ac_cv_search_opendir='none required'}
> ac_cv_type_long_long=${ac_cv_type_long_long=yes}
>
ac_cv_type_unsigned_long_long_int=${ac_cv_type_unsigned_long_long_int=yes}
> ccache_cv_COMPAR_FN_T=${ccache_cv_COMPAR_FN_T=yes}
> hw_cv_func_asprintf=${hw_cv_func_asprintf=yes}
> hw_cv_func_snprintf=${hw_cv_func_snprintf=yes}
> hw_cv_func_snprintf_c99=${hw_cv_func_snprintf_c99=yes}
> hw_cv_func_vasprintf=${hw_cv_func_vasprintf=yes}
> hw_cv_func_vsnprintf=${hw_cv_func_vsnprintf=yes}
> hw_cv_func_vsnprintf_c99=${hw_cv_func_vsnprintf_c99=yes}