From: Chet Ramey Date: Mon, 28 Oct 2024 19:05:35 +0000 (-0400) Subject: fixes for a couple of autoconf macros; update exit builtin for POSIX interp 1602... X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=4917f2859c8624e834f589bbd526a7b707072ce3;p=thirdparty%2Fbash.git fixes for a couple of autoconf macros; update exit builtin for POSIX interp 1602; include more info in EOF error message when parsing compound command; update Makefiles by removing some variables, initializing others; update dependencies on version.h --- diff --git a/CWRU/CWRU.chlog b/CWRU/CWRU.chlog index cfb94b58..268b4781 100644 --- a/CWRU/CWRU.chlog +++ b/CWRU/CWRU.chlog @@ -10465,3 +10465,93 @@ config-top.h doc/bashref.texi - Posix mode: remove item about function names being valid shell identifiers + + 10/25 + ----- +aclocal.m4 + - simplify the checks for the various members of struct dirent + Report and patch from Grisha Levit + +m4/strtoimax.m4 + - simplify and remove redundant caching and cache check + Report and patch from Grisha Levit + +builtins/common.c + - get_exitstat: make the behavior of exit with no arguments + running in a trap action the same as return: check for any trap + (running_trap > 0) in the current execution_context. This is + POSIX interp 1602, in POSIX.1-2024 + +stringlib.c + - find_token_in_alist: if FLAGS is non-zero, do *no* allocate new + memory for the token. The existing behavior is to allocate memory + and return a copy of the token, and all callers pass 0 + +parse.y + - compoundcmd_lineno: now an array of `struct tokeninfo', which + has line number and current compound command information + - change compoundcmd_lineno[compoundcmd_top] to + compoundcmd_lineno[compoundcmd_top].lineno in all calls + - set_compoundcmd_top: in addition to assigning line number info, + assign T to compoundcmd_lineno[compoundcmd_top].token + - report_syntax_error: if we get a syntax error while looking for + shell_eof_token (comsubs), include the token we were looking for + in the error message + - report_syntax_error: if we are reporting an unexpected EOF error, + and compoundcmd_top >= 0, look up the token for the compound + command we're parsing, including `(', and change the error message + to include it + + 10/26 + ----- +Makefile.in + - PURIFY,GLOBC,GLOBO,ALLOC_FILES,LIBRARY_SOURCE: remove + - ADDON_CFLAGS,ADDON_LDDFLAGS: initialize to empty + - GRAM_H: remove from HSOURCES + - profiling-tests: use Program instead of PROGRAM + +builtins/Makefile.in + - DEBUG: initialize from configure + - SYSTEM_FLAGS: remove, since it's not passed from topdir Makefile + - ADDON_CFLAGS: initialize to empty + +lib/glob/Makefile.in + - ADDON_CFLAGS: initialize to empty + +lib/readline/Makefile.in + - ADDON_CFLAGS: initialize to empty + - APP_CFLAGS: remove + +lib/sh/Makefile.in + - DEBUG: initialize from configure + - ADDON_CFLAGS: initialize to empty + - LIBOBJDIR: initialize to empty; configure uses it in LIBOBJS + +lib/tilde/Makefile.in + - ADDON_CFLAGS: initialize to empty + - CCFLAGS: add ADDON_CFLAGS, replacing ASAN_CFLAGS + +support/Makefile.in + - SYSTEM_FLAGS: remove, since it's not passed from topdir Makefile + + Makefiles report and patch from Grisha Levit + +version.c,shell.h + - default_compatibility_level: int variable, initialized to + DEFAULT_COMPAT_LEVEL like shell_compatibility_level + +variables.c + - sv_shcompat: use default_compatibility_level instead of + DEFAULT_COMPAT_LEVEL so variables.o doesn't have to depend on + version.h + +builtins/shopt.def + - set_compatibility_level: use default_compatibility_level instead + of DEFAULT_COMPAT_LEVEL so shopt.o doesn't have to depend on + version.h + - don't include version.h any more + +configure.ac,Makefile.in,support/Makefile.in,doc/Makefile.in + - remove some unused variables: BASE_CFLAGS_FOR_BUILD, DEBUGGER_DIR, + INTLOBJS, TEXINDEX, TEX, MALLOC, SIGNAMES_SUPPORT + From a report by Martin D Kealey diff --git a/Makefile.in b/Makefile.in index 4352eb00..8b62b13e 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1,4 +1,4 @@ -# Makefile for bash-5.3, version 5.6 +# Makefile for bash-5.3, version 5.7 # # Copyright (C) 1996-2024 Free Software Foundation, Inc. @@ -96,9 +96,6 @@ TESTSCRIPT = @TESTSCRIPT@ DEBUGGER_START_FILE = @DEBUGGER_START_FILE@ -#If you have purify, and want to use it, run the make as `make PURIFY=purify' -#PURIFY = @PURIFY@ - # Here is a rule for making .o files from .c files that does not # force the type of the machine (like -M_MACHINE) into the flags. .c.o: @@ -152,6 +149,12 @@ LOCAL_LDFLAGS = @LOCAL_LDFLAGS@ SYSTEM_FLAGS = -DPROGRAM='"$(Program)"' -DCONF_HOSTTYPE='"$(Machine)"' -DCONF_OSTYPE='"$(OS)"' -DCONF_MACHTYPE='"$(MACHTYPE)"' -DCONF_VENDOR='"$(VENDOR)"' $(LOCALE_DEFS) +BASH_MAKEFLAGS = + +# set by lint/sanitize targets +ADDON_CFLAGS = +ADDON_LDFLAGS = + BASE_CCFLAGS = $(SYSTEM_FLAGS) $(LOCAL_DEFS) \ $(DEFS) $(LOCAL_CFLAGS) $(INCLUDES) $(STYLE_CFLAGS) @@ -405,7 +408,6 @@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LTLIBINTL = @LTLIBINTL@ INTLLIBS = @INTLLIBS@ -INTLOBJS = @INTLOBJS@ # Our malloc. MALLOC_TARGET = @MALLOC_TARGET@ @@ -467,9 +469,9 @@ LIBRARY_LDFLAGS = $(READLINE_LDFLAGS) $(HISTORY_LDFLAGS) $(GLOB_LDFLAGS) \ # The main source code for the Bourne Again SHell. CSOURCES = shell.c eval.c parse.y general.c make_cmd.c print_cmd.c y.tab.c \ - dispose_cmd.c execute_cmd.c variables.c $(GLOBC) version.c \ + dispose_cmd.c execute_cmd.c variables.c version.c \ expr.c copy_cmd.c flags.c subst.c hashcmd.c hashlib.c mailcheck.c \ - test.c trap.c alias.c jobs.c nojobs.c $(ALLOC_FILES) braces.c \ + test.c trap.c alias.c jobs.c nojobs.c braces.c \ input.c bashhist.c array.c arrayfunc.c assoc.c sig.c pathexp.c \ unwind_prot.c siglist.c bashline.c bracecomp.c error.c \ list.c stringlib.c locale.c findcmd.c redir.c \ @@ -477,7 +479,7 @@ CSOURCES = shell.c eval.c parse.y general.c make_cmd.c print_cmd.c y.tab.c \ HSOURCES = shell.h flags.h trap.h hashcmd.h hashlib.h jobs.h builtins.h \ general.h variables.h config.h $(ALLOC_HEADERS) alias.h \ - quit.h unwind_prot.h syntax.h ${GRAM_H} \ + quit.h unwind_prot.h syntax.h \ command.h input.h error.h bashansi.h dispose_cmd.h make_cmd.h \ subst.h externs.h siglist.h bashhist.h bashline.h bashtypes.h \ array.h arrayfunc.h sig.h mailcheck.h bashintl.h bashjmp.h \ @@ -512,7 +514,7 @@ SIGNAMES_O = @SIGNAMES_O@ ARRAY_O = @ARRAY_O@ # Matching object files. -OBJECTS = shell.o eval.o y.tab.o general.o make_cmd.o print_cmd.o $(GLOBO) \ +OBJECTS = shell.o eval.o y.tab.o general.o make_cmd.o print_cmd.o \ dispose_cmd.o execute_cmd.o variables.o copy_cmd.o error.o \ expr.o flags.o $(JOBS_O) subst.o hashcmd.o hashlib.o mailcheck.o \ trap.o input.o unwind_prot.o pathexp.o sig.o test.o version.o \ @@ -525,7 +527,6 @@ BUILTIN_SRCDIR=$(srcdir)/builtins DEFSRC=$(BUILTIN_SRCDIR) BUILTIN_ABSSRC=${topdir}/builtins DEFDIR = $(dot)/builtins -DEBUGGER_DIR = $(dot)/debugger BUILTIN_DEFS = $(DEFSRC)/alias.def $(DEFSRC)/bind.def $(DEFSRC)/break.def \ $(DEFSRC)/builtin.def $(DEFSRC)/cd.def $(DEFSRC)/colon.def \ @@ -578,10 +579,9 @@ DOCDIR = $(dot)/doc PO_SRC = $(srcdir)/po/ PO_DIR = $(dot)/po/ -SIGNAMES_SUPPORT = $(SUPPORT_SRC)mksignames.c - +# Auxiliary support files SUPPORT_SRC = $(srcdir)/support/ -SDIR = $(dot)/support +SUPPORT_DIR = $(dot)/support TESTS_SUPPORT = recho$(EXEEXT) zecho$(EXEEXT) printenv$(EXEEXT) xcase$(EXEEXT) CREATED_SUPPORT = signames.h recho$(EXEEXT) zecho$(EXEEXT) printenv$(EXEEXT) \ @@ -614,12 +614,12 @@ LOADABLES_DIR = ${top_builddir}/examples/loadables # Keep GNU Make from exporting the entire environment for small machines. .NOEXPORT: -.made: $(Program) bashbug $(SDIR)/man2html$(EXEEXT) +.made: $(Program) bashbug $(SUPPORT_DIR)/man2html$(EXEEXT) @echo "$(Program) last made for a $(Machine) running $(OS)" >.made $(Program): $(OBJECTS) $(BUILTINS_DEP) $(LIBDEP) .build $(RM) $@ - $(PURIFY) $(CC) $(BUILTINS_LDFLAGS) $(LIBRARY_LDFLAGS) $(LDFLAGS) -o $(Program) $(OBJECTS) $(LIBS) + $(CC) $(BUILTINS_LDFLAGS) $(LIBRARY_LDFLAGS) $(LDFLAGS) -o $(Program) $(OBJECTS) $(LIBS) ls -l $(Program) -$(SIZE) $(Program) @@ -632,9 +632,9 @@ $(Program): $(OBJECTS) $(BUILTINS_DEP) $(LIBDEP) .build @echo " ***********************************************************" @echo -bashbug: $(SDIR)/bashbug.sh $(VERSPROG) +bashbug: $(SUPPORT_DIR)/bashbug.sh $(VERSPROG) @sed -e "s%!PATCHLEVEL!%$(PatchLevel)%" \ - $(SDIR)/bashbug.sh > $@ + $(SUPPORT_DIR)/bashbug.sh > $@ @chmod a+rx bashbug strip: $(Program) .made @@ -661,7 +661,6 @@ lsan: gcov: ${MAKE} $(BASH_MAKEFLAGS) CFLAGS=-g ADDON_CFLAGS='${GCOV_XCFLAGS}' ADDON_LDFLAGS='${GCOV_XLDFLAGS}' .made - # have to make this separate because making tests depend on $(PROGRAM) asan-tests: asan $(TESTS_SUPPORT) @-test -d tests || mkdir tests @@ -676,7 +675,7 @@ lsan-tests: lsan $(TESTS_SUPPORT) @( cd $(srcdir)/tests && \ BUILD_DIR=$(BUILD_DIR) PATH=$(BUILD_DIR)/tests:$$PATH THIS_SH=$(THIS_SH) $(SHELL) ${TESTSCRIPT} ) -profiling-tests: ${PROGRAM} +profiling-tests: ${Program} @test "X$$PROFILE_FLAGS" == "X" && { echo "profiling-tests: must be built with profiling enabled" >&2; exit 1; } @${MAKE} $(BASH_MAKEFLAGS) tests TESTSCRIPT=run-gprof @@ -796,7 +795,7 @@ syntax.c: mksyntax${EXEEXT} $(srcdir)/syntax.h $(RM) $@ ./mksyntax$(EXEEXT) -o $@ -$(BUILTINS_LIBRARY): $(DEFDIR)/builtext.h $(BUILTIN_DEFS) $(BUILTIN_C_SRC) config.h ${BASHINCDIR}/memalloc.h version.h +$(BUILTINS_LIBRARY): $(DEFDIR)/builtext.h $(BUILTIN_DEFS) $(BUILTIN_C_SRC) config.h ${BASHINCDIR}/memalloc.h @(cd $(DEFDIR) && $(MAKE) $(BASH_MAKEFLAGS) DEBUG=${DEBUG} targets ) || exit 1 # these require special rules to circumvent make builtin rules @@ -812,8 +811,8 @@ ${DEFDIR}/builtext.h: $(BUILTIN_DEFS) ${DEFDIR}/pipesize.h: ${BUILTINS_LIBRARY} @(cd $(DEFDIR) && $(MAKE) $(BASH_MAKEFLAGS) pipesize.h ) || exit 1 -$(SDIR)/man2html$(EXEEXT): ${SUPPORT_SRC}/man2html.c - @(cd $(SDIR) && $(MAKE) $(BASH_MAKEFLAGS) all ) || exit 1 +$(SUPPORT_DIR)/man2html$(EXEEXT): $(SUPPORT_SRC)man2html.c + @(cd $(SUPPORT_DIR) && $(MAKE) $(BASH_MAKEFLAGS) all ) || exit 1 # For the justification of the following Makefile rules, see node # `Automatic Remaking' in GNU Autoconf documentation. @@ -846,8 +845,8 @@ pathnames.h: Makefile $(srcdir)/pathnames.h.in buildconf.h: $(srcdir)/buildconf.h.in CONFIG_FILES= CONFIG_HEADERS=buildconf.h $(SHELL) ./config.status -$(SDIR)/bashbug.sh: $(SDIR)/bashbug.sh.in - CONFIG_FILES=$(SDIR)/bashbug.sh CONFIG_HEADERS= $(SHELL) ./config.status +$(SUPPORT_DIR)/bashbug.sh: $(SUPPORT_DIR)/bashbug.sh.in + CONFIG_FILES=$(SUPPORT_DIR)/bashbug.sh CONFIG_HEADERS= $(SHELL) ./config.status # comment out for distribution $(srcdir)/configure: $(srcdir)/configure.ac $(srcdir)/aclocal.m4 $(srcdir)/config.h.in @@ -876,11 +875,11 @@ info dvi ps: force force: # unused -TAGS: $(SOURCES) $(BUILTIN_C_SRC) $(LIBRARY_SOURCE) - ( cd $(topdir) && $(ETAGS) $(ETAGSFLAGS) $(SOURCES) $(BUILTIN_C_SRC) $(LIBRARY_SOURCE) ) +TAGS: $(SOURCES) $(BUILTIN_C_SRC) + ( cd $(topdir) && $(ETAGS) $(ETAGSFLAGS) $(SOURCES) $(BUILTIN_C_SRC) ) -tags: $(SOURCES) $(BUILTIN_C_SRC) $(LIBRARY_SOURCE) - ( cd $(topdir) && $(CTAGS) $(CTAGSFLAGS) $(SOURCES) $(BUILTIN_C_SRC) $(LIBRARY_SOURCE) > $@ ) +tags: $(SOURCES) $(BUILTIN_C_SRC) + ( cd $(topdir) && $(CTAGS) $(CTAGSFLAGS) $(SOURCES) $(BUILTIN_C_SRC) ) # Targets that actually do things not part of the build @@ -931,7 +930,7 @@ install-headers: install-headers-dirs ${INSTALL_DATA} $(srcdir)/"$$hf" $(DESTDIR)$(headersdir)/$$hf || exit 1; \ fi ; \ done - -$(INSTALL_DATA) $(SDIR)/bash.pc $(DESTDIR)$(pkgconfigdir)/bash.pc + -$(INSTALL_DATA) $(SUPPORT_DIR)/bash.pc $(DESTDIR)$(pkgconfigdir)/bash.pc uninstall-headers: -( cd $(DESTDIR)$(headersdir) && $(RM) $(INSTALLED_HEADERS) ) @@ -962,7 +961,7 @@ basic-clean: clean: basic-clean ( cd $(DOCDIR) && $(MAKE) $(BASH_MAKEFLAGS) $@ ) ( cd builtins && $(MAKE) $(BASH_MAKEFLAGS) $@ ) - -( cd $(SDIR) && $(MAKE) $(BASH_MAKEFLAGS) $@ ) + -( cd $(SUPPORT_DIR) && $(MAKE) $(BASH_MAKEFLAGS) $@ ) -for libdir in ${LIB_SUBDIRS}; do \ (cd $$libdir && test -f Makefile && $(MAKE) $(BASH_MAKEFLAGS) $@) ;\ done @@ -974,7 +973,7 @@ clean: basic-clean mostlyclean: basic-clean ( cd $(DOCDIR) && $(MAKE) $(BASH_MAKEFLAGS) $@ ) ( cd builtins && $(MAKE) $(BASH_MAKEFLAGS) $@ ) - -( cd $(SDIR) && $(MAKE) $(BASH_MAKEFLAGS) $@ ) + -( cd $(SUPPORT_DIR) && $(MAKE) $(BASH_MAKEFLAGS) $@ ) -for libdir in ${LIB_SUBDIRS}; do \ (cd $$libdir && test -f Makefile && $(MAKE) $(BASH_MAKEFLAGS) $@) ;\ done @@ -984,7 +983,7 @@ mostlyclean: basic-clean distclean: basic-clean maybe-clean ( cd $(DOCDIR) && $(MAKE) $(BASH_MAKEFLAGS) $@ ) ( cd builtins && $(MAKE) $(BASH_MAKEFLAGS) $@ ) - -( cd $(SDIR) && $(MAKE) $(BASH_MAKEFLAGS) $@ ) + -( cd $(SUPPORT_DIR) && $(MAKE) $(BASH_MAKEFLAGS) $@ ) -for libdir in ${LIB_SUBDIRS}; do \ (cd $$libdir && test -f Makefile && $(MAKE) $(BASH_MAKEFLAGS) $@) ;\ done @@ -1000,7 +999,7 @@ maintainer-clean: basic-clean $(RM) y.tab.c y.tab.h parser-built tags TAGS ( cd $(DOCDIR) && $(MAKE) $(BASH_MAKEFLAGS) $@ ) ( cd builtins && $(MAKE) $(BASH_MAKEFLAGS) $@ ) - ( cd $(SDIR) && $(MAKE) $(BASH_MAKEFLAGS) $@ ) + ( cd $(SUPPORT_DIR) && $(MAKE) $(BASH_MAKEFLAGS) $@ ) -for libdir in ${LIB_SUBDIRS}; do \ (cd $$libdir && test -f Makefile && $(MAKE) $(BASH_MAKEFLAGS) $@) ;\ done @@ -1303,7 +1302,7 @@ variables.o: flags.h execute_cmd.h mailcheck.h input.h $(DEFSRC)/common.h variables.o: findcmd.h bashhist.h hashcmd.h pathexp.h variables.o: pcomplete.h ${BASHINCDIR}/chartypes.h variables.o: ${BASHINCDIR}/posixtime.h assoc.h ${DEFSRC}/getopt.h -variables.o: version.h $(DEFDIR)/builtext.h +variables.o: $(DEFDIR)/builtext.h version.o: conftypes.h patchlevel.h version.h version.o: buildconf.h xmalloc.o: config.h bashtypes.h ${BASHINCDIR}/ansi_stdlib.h error.h diff --git a/aclocal.m4 b/aclocal.m4 index cb2f06f6..7253f2c4 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -1025,7 +1025,7 @@ dnl like _AC_STRUCT_DIRENT(MEMBER) but public AC_DEFUN(BASH_STRUCT_DIRENT, [ AC_REQUIRE([AC_HEADER_DIRENT]) -AC_CHECK_MEMBERS(struct dirent.$1, bash_cv_dirent_has_$1=yes, bash_cv_dirent_has_$1=no, +AC_CHECK_MEMBERS(struct dirent.$1, [], [], [[ #include #include @@ -1049,35 +1049,9 @@ AC_CHECK_MEMBERS(struct dirent.$1, bash_cv_dirent_has_$1=yes, bash_cv_dirent_has ]]) ]) -AC_DEFUN(BASH_STRUCT_DIRENT_D_INO, -[AC_REQUIRE([AC_HEADER_DIRENT]) -AC_MSG_CHECKING(for struct dirent.d_ino) -AC_CACHE_VAL(bash_cv_dirent_has_d_ino, [BASH_STRUCT_DIRENT([d_ino])]) -AC_MSG_RESULT($bash_cv_dirent_has_d_ino) -if test $bash_cv_dirent_has_d_ino = yes; then -AC_DEFINE(HAVE_STRUCT_DIRENT_D_INO) -fi -]) - -AC_DEFUN(BASH_STRUCT_DIRENT_D_FILENO, -[AC_REQUIRE([AC_HEADER_DIRENT]) -AC_MSG_CHECKING(for struct dirent.d_fileno) -AC_CACHE_VAL(bash_cv_dirent_has_d_fileno, [BASH_STRUCT_DIRENT([d_fileno])]) -AC_MSG_RESULT($bash_cv_dirent_has_d_fileno) -if test $bash_cv_dirent_has_d_fileno = yes; then -AC_DEFINE(HAVE_STRUCT_DIRENT_D_FILENO) -fi -]) - -AC_DEFUN(BASH_STRUCT_DIRENT_D_NAMLEN, -[AC_REQUIRE([AC_HEADER_DIRENT]) -AC_MSG_CHECKING(for struct dirent.d_namlen) -AC_CACHE_VAL(bash_cv_dirent_has_d_namlen, [BASH_STRUCT_DIRENT([d_namlen])]) -AC_MSG_RESULT($bash_cv_dirent_has_d_namlen) -if test $bash_cv_dirent_has_d_namlen = yes; then -AC_DEFINE(HAVE_STRUCT_DIRENT_D_NAMLEN) -fi -]) +AC_DEFUN([BASH_STRUCT_DIRENT_D_INO], [BASH_STRUCT_DIRENT([d_ino])]) +AC_DEFUN([BASH_STRUCT_DIRENT_D_FILENO], [BASH_STRUCT_DIRENT([d_fileno])]) +AC_DEFUN([BASH_STRUCT_DIRENT_D_NAMLEN], [BASH_STRUCT_DIRENT([d_namlen])]) AC_DEFUN(BASH_STRUCT_TIMEVAL, [AC_MSG_CHECKING(for struct timeval in sys/time.h and time.h) diff --git a/builtins/Makefile.in b/builtins/Makefile.in index 64643c73..3ce607ab 100644 --- a/builtins/Makefile.in +++ b/builtins/Makefile.in @@ -56,6 +56,8 @@ BUILD_DIR = @BUILD_DIR@ LIBBUILD = ${BUILD_DIR}/lib +DEBUG = @DEBUG@ + PROFILE_FLAGS = @PROFILE_FLAGS@ CFLAGS = @CFLAGS@ CFLAGS_FOR_BUILD = @CFLAGS_FOR_BUILD@ @CROSS_COMPILE@ @@ -95,9 +97,10 @@ HELPFILES_TARGET = @HELPFILES_TARGET@ INCLUDES = -I. -I.. @RL_INCLUDE@ -I$(topdir) -I$(BASHINCDIR) -I$(topdir)/lib -I$(srcdir) ${INTL_INC} -BASE_CCFLAGS = ${PROFILE_FLAGS} $(DEFS) $(LOCAL_DEFS) $(SYSTEM_FLAGS) \ +BASE_CCFLAGS = ${PROFILE_FLAGS} $(DEFS) $(LOCAL_DEFS) \ ${INCLUDES} $(STYLE_CFLAGS) $(LOCAL_CFLAGS) +ADDON_CFLAGS= CCFLAGS = ${ADDON_CFLAGS} $(BASE_CCFLAGS) $(CPPFLAGS) $(CFLAGS) CCFLAGS_FOR_BUILD = $(BASE_CCFLAGS) $(CPPFLAGS_FOR_BUILD) $(CFLAGS_FOR_BUILD) @@ -268,8 +271,9 @@ distclean maintainer-clean: clean $(OFILES): $(MKBUILTINS) ../config.h -../version.h: ../config.h ../Makefile Makefile - -( cd ${BUILD_DIR} && ${MAKE} ${BASH_MAKEFLAGS} version.h ) +# sketchy rule here +#../version.h: ../config.h ../Makefile Makefile +# -( cd ${BUILD_DIR} && ${MAKE} ${BASH_MAKEFLAGS} version.h ) # maintainer special - for now po: builtins.c diff --git a/builtins/common.c b/builtins/common.c index 13a6b7b3..a681cee4 100644 --- a/builtins/common.c +++ b/builtins/common.c @@ -538,6 +538,9 @@ get_exitstat (WORD_LIST *list) return value. */ if (this_shell_builtin == return_builtin && running_trap > 0 && running_trap != DEBUG_TRAP+1 && trap_return_context == funcnest + sourcenest) return (trap_saved_exit_value); + /* The same interp applies to the exit builtin. */ + if (this_shell_builtin == exit_builtin && running_trap > 0 && running_trap != DEBUG_TRAP+1 && trap_return_context == funcnest + sourcenest) + return (trap_saved_exit_value); return (last_command_exit_value); } diff --git a/builtins/exit.def b/builtins/exit.def index 94c2bf3f..32b55420 100644 --- a/builtins/exit.def +++ b/builtins/exit.def @@ -1,7 +1,7 @@ This file is exit.def, from which is created exit.c. It implements the builtins "exit", and "logout" in Bash. -Copyright (C) 1987-2023 Free Software Foundation, Inc. +Copyright (C) 1987-2024 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -138,7 +138,8 @@ exit_or_logout (WORD_LIST *list) /* If we're running the exit trap (running_trap == 1, since running_trap gets set to SIG+1), and we don't have a argument given to `exit' (list == 0), use the exit status we saved before running the trap - commands (trap_saved_exit_value). */ + commands (trap_saved_exit_value). get_exitstat() handles the case of + running exit from any other trap action (POSIX interp 1602). */ exit_value = (running_trap == 1 && list == 0) ? trap_saved_exit_value : get_exitstat (list); if (exit_value > EX_SHERRBASE) /* some kind of error */ return (exit_value); diff --git a/builtins/shopt.def b/builtins/shopt.def index fa0b7b8c..8d7ff454 100644 --- a/builtins/shopt.def +++ b/builtins/shopt.def @@ -52,8 +52,6 @@ $END #include -#include "version.h" - #include "../bashintl.h" #include "../shell.h" @@ -689,10 +687,10 @@ set_compatibility_level (char *option_name, int mode) shell_compatibility_level = 43; else if (shopt_compat44) shell_compatibility_level = 44; - else if (oldval > 44 && shell_compatibility_level < DEFAULT_COMPAT_LEVEL) + else if (oldval > 44 && shell_compatibility_level < default_compatibility_level) ; else - shell_compatibility_level = DEFAULT_COMPAT_LEVEL; + shell_compatibility_level = default_compatibility_level; /* Make sure the current compatibility level is reflected in BASH_COMPAT */ rhs = itos (shell_compatibility_level); @@ -710,9 +708,12 @@ set_compatibility_opts (void) shopt_compat31 = shopt_compat32 = 0; shopt_compat40 = shopt_compat41 = shopt_compat42 = shopt_compat43 = 0; shopt_compat44 = 0; + if (shell_compatibility_level == default_compatibility_level) + return; + switch (shell_compatibility_level) { - case DEFAULT_COMPAT_LEVEL: + case 52: /* completeness */ case 51: /* completeness */ case 50: break; diff --git a/configure b/configure index 5a0f0310..b80bdbd3 100755 --- a/configure +++ b/configure @@ -1,5 +1,5 @@ #! /bin/sh -# From configure.ac for Bash 5.3, version 5.071. +# From configure.ac for Bash 5.3, version 5.073. # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.72 for bash 5.3-beta. # @@ -762,7 +762,6 @@ RL_MAJOR RL_VERSION LIBS_FOR_BUILD STYLE_CFLAGS -BASE_CFLAGS_FOR_BUILD STATIC_LD SIGNAMES_O SIGNAMES_H @@ -5424,11 +5423,9 @@ if test "X$cross_compiling" = "Xno"; then # CFLAGS set above to default value if not passed in environment if test -n "$want_auto_cflags" ; then CFLAGS_FOR_BUILD="${CFLAGS}" - BASE_CFLAGS_FOR_BUILD="${CFLAGS}" else # passed in environment CFLAGS_FOR_BUILD=${CFLAGS-'$(CFLAGS)'} - BASE_CFLAGS_FOR_BUILD=${CFLAGS-'$(CFLAGS)'} fi LIBS_FOR_BUILD=${LIBS_FOR_BUILD-'$(LIBS)'} else @@ -5436,7 +5433,6 @@ else CPPFLAGS_FOR_BUILD=${CPPFLAGS_FOR_BUILD-""} LDFLAGS_FOR_BUILD=${LDFLAGS_FOR_BUILD-""} CFLAGS_FOR_BUILD=${CFLAGS_FOR_BUILD="-g"} - BASE_CFLAGS_FOR_BUILD=${BASE_CFLAGS_FOR_BUILD="-g"} LIBS_FOR_BUILD=${LIBS_FOR_BUILD-""} fi @@ -5454,7 +5450,6 @@ fi - if test "$opt_readline" = yes && test "$opt_with_installed_readline" != "no" then # If the user specified --with-installed-readline=PREFIX and PREFIX @@ -9226,8 +9221,8 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam \ LIBS=$save_LIBS test $gl_pthread_api = yes && break done - echo "$as_me:9229: gl_pthread_api=$gl_pthread_api" >&5 - echo "$as_me:9230: LIBPTHREAD=$LIBPTHREAD" >&5 + echo "$as_me:9224: gl_pthread_api=$gl_pthread_api" >&5 + echo "$as_me:9225: LIBPTHREAD=$LIBPTHREAD" >&5 gl_pthread_in_glibc=no # On Linux with glibc >= 2.34, libc contains the fully functional @@ -9253,7 +9248,7 @@ rm -rf conftest* ;; esac - echo "$as_me:9256: gl_pthread_in_glibc=$gl_pthread_in_glibc" >&5 + echo "$as_me:9251: gl_pthread_in_glibc=$gl_pthread_in_glibc" >&5 # Test for libpthread by looking for pthread_kill. (Not pthread_self, # since it is defined as a macro on OSF/1.) @@ -9431,7 +9426,7 @@ fi fi fi - echo "$as_me:9434: LIBPMULTITHREAD=$LIBPMULTITHREAD" >&5 + echo "$as_me:9429: LIBPMULTITHREAD=$LIBPMULTITHREAD" >&5 fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether POSIX threads API is available" >&5 printf %s "checking whether POSIX threads API is available... " >&6; } @@ -9678,8 +9673,8 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam \ LIBS=$save_LIBS test $gl_pthread_api = yes && break done - echo "$as_me:9681: gl_pthread_api=$gl_pthread_api" >&5 - echo "$as_me:9682: LIBPTHREAD=$LIBPTHREAD" >&5 + echo "$as_me:9676: gl_pthread_api=$gl_pthread_api" >&5 + echo "$as_me:9677: LIBPTHREAD=$LIBPTHREAD" >&5 gl_pthread_in_glibc=no # On Linux with glibc >= 2.34, libc contains the fully functional @@ -9705,7 +9700,7 @@ rm -rf conftest* ;; esac - echo "$as_me:9708: gl_pthread_in_glibc=$gl_pthread_in_glibc" >&5 + echo "$as_me:9703: gl_pthread_in_glibc=$gl_pthread_in_glibc" >&5 # Test for libpthread by looking for pthread_kill. (Not pthread_self, # since it is defined as a macro on OSF/1.) @@ -9883,7 +9878,7 @@ fi fi fi - echo "$as_me:9886: LIBPMULTITHREAD=$LIBPMULTITHREAD" >&5 + echo "$as_me:9881: LIBPMULTITHREAD=$LIBPMULTITHREAD" >&5 fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether POSIX threads API is available" >&5 printf %s "checking whether POSIX threads API is available... " >&6; } @@ -19911,13 +19906,6 @@ fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for struct dirent.d_ino" >&5 -printf %s "checking for struct dirent.d_ino... " >&6; } -if test ${bash_cv_dirent_has_d_ino+y} -then : - printf %s "(cached) " >&6 -else case e in #( - e) ac_fn_c_check_member "$LINENO" "struct dirent" "d_ino" "ac_cv_member_struct_dirent_d_ino" " #include @@ -19946,31 +19934,11 @@ then : printf "%s\n" "#define HAVE_STRUCT_DIRENT_D_INO 1" >>confdefs.h -bash_cv_dirent_has_d_ino=yes -else case e in #( - e) bash_cv_dirent_has_d_ino=no ;; -esac -fi - ;; -esac fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_dirent_has_d_ino" >&5 -printf "%s\n" "$bash_cv_dirent_has_d_ino" >&6; } -if test $bash_cv_dirent_has_d_ino = yes; then -printf "%s\n" "#define HAVE_STRUCT_DIRENT_D_INO 1" >>confdefs.h - -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for struct dirent.d_fileno" >&5 -printf %s "checking for struct dirent.d_fileno... " >&6; } -if test ${bash_cv_dirent_has_d_fileno+y} -then : - printf %s "(cached) " >&6 -else case e in #( - e) ac_fn_c_check_member "$LINENO" "struct dirent" "d_fileno" "ac_cv_member_struct_dirent_d_fileno" " #include @@ -19999,32 +19967,12 @@ then : printf "%s\n" "#define HAVE_STRUCT_DIRENT_D_FILENO 1" >>confdefs.h -bash_cv_dirent_has_d_fileno=yes -else case e in #( - e) bash_cv_dirent_has_d_fileno=no ;; -esac -fi - ;; -esac fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_dirent_has_d_fileno" >&5 -printf "%s\n" "$bash_cv_dirent_has_d_fileno" >&6; } -if test $bash_cv_dirent_has_d_fileno = yes; then -printf "%s\n" "#define HAVE_STRUCT_DIRENT_D_FILENO 1" >>confdefs.h -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for struct dirent.d_namlen" >&5 -printf %s "checking for struct dirent.d_namlen... " >&6; } -if test ${bash_cv_dirent_has_d_namlen+y} -then : - printf %s "(cached) " >&6 -else case e in #( - e) - ac_fn_c_check_member "$LINENO" "struct dirent" "d_namlen" "ac_cv_member_struct_dirent_d_namlen" " #include #include @@ -20052,22 +20000,9 @@ then : printf "%s\n" "#define HAVE_STRUCT_DIRENT_D_NAMLEN 1" >>confdefs.h -bash_cv_dirent_has_d_namlen=yes -else case e in #( - e) bash_cv_dirent_has_d_namlen=no ;; -esac -fi - ;; -esac fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_dirent_has_d_namlen" >&5 -printf "%s\n" "$bash_cv_dirent_has_d_namlen" >&6; } -if test $bash_cv_dirent_has_d_namlen = yes; then -printf "%s\n" "#define HAVE_STRUCT_DIRENT_D_NAMLEN 1" >>confdefs.h - -fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for struct winsize in sys/ioctl.h and termios.h" >&5 printf %s "checking for struct winsize in sys/ioctl.h and termios.h... " >&6; } @@ -21467,15 +21402,6 @@ printf "%s\n" "#define HAVE_VSNPRINTF 0" >>confdefs.h -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for usable strtoimax" >&5 -printf %s "checking for usable strtoimax... " >&6; } -if test ${bash_cv_func_strtoimax+y} -then : - printf %s "(cached) " >&6 -else case e in #( - e) - HAVE_STRTOIMAX=0 HAVE_DECL_STRTOIMAX=0 - ac_fn_c_check_func "$LINENO" "strtoimax" "ac_cv_func_strtoimax" if test "x$ac_cv_func_strtoimax" = xyes then : @@ -21494,35 +21420,14 @@ fi printf "%s\n" "#define HAVE_DECL_STRTOIMAX $ac_have_decl" >>confdefs.h - if test "$ac_cv_func_strtoimax" = "yes" ; then - HAVE_STRTOIMAX=1 - fi - if test "$ac_cv_have_decl_strtoimax" = "yes" ; then - HAVE_DECL_STRTOIMAX=1 - fi - if test "$HAVE_STRTOIMAX" = 0 || test "$HAVE_DECL_STRTOIMAX" = 0 ; then - bash_cv_func_strtoimax=no REPLACE_STRTOIMAX=1 - else - bash_cv_func_strtoimax=yes - fi - ;; -esac -fi - -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_func_strtoimax" >&5 -printf "%s\n" "$bash_cv_func_strtoimax" >&6; } -if test "$ac_cv_have_decl_strtoimax" = "yes" ; then -printf "%s\n" "#define HAVE_DECL_STRTOIMAX 1" >>confdefs.h - -fi -if test $bash_cv_func_strtoimax = no; then -case " $LIBOBJS " in + if test "$ac_cv_func_strtoimax" != "yes" ; then + case " $LIBOBJS " in *" strtoimax.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS strtoimax.$ac_objext" ;; esac -fi + fi ac_fn_check_decl "$LINENO" "clearerr_unlocked" "ac_cv_have_decl_clearerr_unlocked" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_clearerr_unlocked" = xyes diff --git a/configure.ac b/configure.ac index 124437dd..44b458d5 100644 --- a/configure.ac +++ b/configure.ac @@ -21,7 +21,7 @@ dnl Process this file with autoconf to produce a configure script. # You should have received a copy of the GNU General Public License # along with this program. If not, see . -AC_REVISION([for Bash 5.3, version 5.071])dnl +AC_REVISION([for Bash 5.3, version 5.073])dnl define(bashvers, 5.3) define(relstatus, beta) @@ -547,11 +547,9 @@ if test "X$cross_compiling" = "Xno"; then # CFLAGS set above to default value if not passed in environment if test -n "$want_auto_cflags" ; then CFLAGS_FOR_BUILD="${CFLAGS}" - BASE_CFLAGS_FOR_BUILD="${CFLAGS}" else # passed in environment CFLAGS_FOR_BUILD=${CFLAGS-'$(CFLAGS)'} - BASE_CFLAGS_FOR_BUILD=${CFLAGS-'$(CFLAGS)'} fi LIBS_FOR_BUILD=${LIBS_FOR_BUILD-'$(LIBS)'} else @@ -559,7 +557,6 @@ else CPPFLAGS_FOR_BUILD=${CPPFLAGS_FOR_BUILD-""} LDFLAGS_FOR_BUILD=${LDFLAGS_FOR_BUILD-""} CFLAGS_FOR_BUILD=${CFLAGS_FOR_BUILD="-g"} - BASE_CFLAGS_FOR_BUILD=${BASE_CFLAGS_FOR_BUILD="-g"} LIBS_FOR_BUILD=${LIBS_FOR_BUILD-""} fi @@ -570,7 +567,6 @@ AC_SUBST(STATIC_LD) AC_SUBST(CC_FOR_BUILD) AC_SUBST(CFLAGS_FOR_BUILD) -AC_SUBST(BASE_CFLAGS_FOR_BUILD) AC_SUBST(STYLE_CFLAGS) AC_SUBST(CPPFLAGS_FOR_BUILD) AC_SUBST(LDFLAGS_FOR_BUILD) diff --git a/doc/Makefile.in b/doc/Makefile.in index a6021da6..56b3fe9f 100644 --- a/doc/Makefile.in +++ b/doc/Makefile.in @@ -65,10 +65,6 @@ SUPPORT_SRCDIR = $(topdir)/support # bad style RL_LIBDIR = $(topdir)/lib/readline -# unused -TEXINDEX = texindex -TEX = tex - MAKEINFO = makeinfo TEXI2DVI = ${SUPPORT_SRCDIR}/texi2dvi TEXI2HTML = ${SUPPORT_SRCDIR}/texi2html diff --git a/lib/glob/Makefile.in b/lib/glob/Makefile.in index 503cd873..48da8fcb 100644 --- a/lib/glob/Makefile.in +++ b/lib/glob/Makefile.in @@ -39,6 +39,7 @@ MV = mv SHELL = @MAKE_SHELL@ PROFILE_FLAGS = @PROFILE_FLAGS@ +ADDON_CFLAGS = CFLAGS = @CFLAGS@ LOCAL_CFLAGS = @LOCAL_CFLAGS@ diff --git a/lib/malloc/Makefile.in b/lib/malloc/Makefile.in index 7ec8f64f..c2f00d8e 100644 --- a/lib/malloc/Makefile.in +++ b/lib/malloc/Makefile.in @@ -72,7 +72,6 @@ ALLOCA_SOURCE = alloca.c ALLOCA_OBJECT = alloca.o MALLOC_SRC = @MALLOC_SRC@ -MALLOC = @MALLOC@ ALLOCA = @ALLOCA@ MALLOC_OBJS = malloc.o $(ALLOCA) trace.o stats.o table.o watch.o diff --git a/lib/readline/Makefile.in b/lib/readline/Makefile.in index 1b4afcdf..477a4cfc 100644 --- a/lib/readline/Makefile.in +++ b/lib/readline/Makefile.in @@ -54,6 +54,8 @@ CTAGS = ctags -tw DEBUG = @DEBUG@ +ADDON_CFLAGS = + CFLAGS = @CFLAGS@ LOCAL_CFLAGS = @LOCAL_CFLAGS@ ${DEBUG} STYLE_CFLAGS = @STYLE_CFLAGS@ diff --git a/lib/sh/Makefile.in b/lib/sh/Makefile.in index fa7463d7..dc7ccbec 100644 --- a/lib/sh/Makefile.in +++ b/lib/sh/Makefile.in @@ -55,6 +55,8 @@ MV = mv SHELL = @MAKE_SHELL@ +DEBUG = @DEBUG@ + CFLAGS = @CFLAGS@ LOCAL_CFLAGS = @LOCAL_CFLAGS@ ${DEBUG} STYLE_CFLAGS = @STYLE_CFLAGS@ @@ -63,6 +65,8 @@ LDFLAGS = @LDFLAGS@ @LOCAL_LDFLAGS@ PROFILE_FLAGS = @PROFILE_FLAGS@ +ADDON_CFLAGS = + DEFS = @DEFS@ LOCAL_DEFS = @LOCAL_DEFS@ @@ -101,6 +105,7 @@ CSOURCES = clktck.c clock.c getcwd.c getenv.c oslib.c setlinebuf.c \ HSOURCES = # The object files contained in $(LIBRARY_NAME) +LIBOBJDIR = LIBOBJS = @LIBOBJS@ OBJECTS = clktck.o clock.o getenv.o oslib.o setlinebuf.o strnlen.o \ itos.o zread.o zwrite.o shtty.o shmatch.o eaccess.o \ diff --git a/lib/tilde/Makefile.in b/lib/tilde/Makefile.in index a79a5248..ea9bb626 100644 --- a/lib/tilde/Makefile.in +++ b/lib/tilde/Makefile.in @@ -40,6 +40,8 @@ SHELL = @MAKE_SHELL@ PROFILE_FLAGS = @PROFILE_FLAGS@ +ADDON_CFLAGS = + CFLAGS = @CFLAGS@ LOCAL_CFLAGS = @LOCAL_CFLAGS@ STYLE_CFLAGS = @STYLE_CFLAGS@ @@ -53,8 +55,9 @@ BASHINCDIR = ${topdir}/include INCLUDES = -I. -I../.. -I$(topdir) -I${BASHINCDIR} -I$(topdir)/lib -CCFLAGS = ${ASAN_CFLAGS} $(PROFILE_FLAGS) $(DEFS) $(LOCAL_DEFS) $(CPPFLAGS) \ - ${INCLUDES} $(STYLE_CFLAGS) $(LOCAL_CFLAGS) $(CFLAGS) +CCFLAGS = $(PROFILE_FLAGS) $(DEFS) $(LOCAL_DEFS) $(CPPFLAGS) \ + ${INCLUDES} $(STYLE_CFLAGS) $(LOCAL_CFLAGS) $(CFLAGS) \ + ${ADDON_CFLAGS} .c.o: $(CC) -c $(CCFLAGS) $< diff --git a/m4/strtoimax.m4 b/m4/strtoimax.m4 index 4d6cb3ba..ab68735f 100644 --- a/m4/strtoimax.m4 +++ b/m4/strtoimax.m4 @@ -6,32 +6,12 @@ dnl with or without modifications, as long as this notice is preserved. dnl Make sure we replace strtoimax if we don't have a declaration dnl We can use this as a template for future function checks -AC_DEFUN([BASH_FUNC_STRTOIMAX], [ -AC_MSG_CHECKING([for usable strtoimax]) -AC_CACHE_VAL(bash_cv_func_strtoimax, +AC_DEFUN([BASH_FUNC_STRTOIMAX], [ - HAVE_STRTOIMAX=0 HAVE_DECL_STRTOIMAX=0 - AC_CHECK_FUNCS([strtoimax]) AC_CHECK_DECLS([strtoimax]) - if test "$ac_cv_func_strtoimax" = "yes" ; then - HAVE_STRTOIMAX=1 - fi - if test "$ac_cv_have_decl_strtoimax" = "yes" ; then - HAVE_DECL_STRTOIMAX=1 + if test "$ac_cv_func_strtoimax" != "yes" ; then + AC_LIBOBJ(strtoimax) fi - if test "$HAVE_STRTOIMAX" = 0 || test "$HAVE_DECL_STRTOIMAX" = 0 ; then - bash_cv_func_strtoimax=no REPLACE_STRTOIMAX=1 - else - bash_cv_func_strtoimax=yes - fi -]) -AC_MSG_RESULT($bash_cv_func_strtoimax) -if test "$ac_cv_have_decl_strtoimax" = "yes" ; then -AC_DEFINE([HAVE_DECL_STRTOIMAX], [1]) -fi -if test $bash_cv_func_strtoimax = no; then -AC_LIBOBJ(strtoimax) -fi ]) diff --git a/parse.y b/parse.y index a0535294..96bbd024 100644 --- a/parse.y +++ b/parse.y @@ -341,10 +341,12 @@ static int token_before_that; /* The token read prior to token_before_that. */ static int two_tokens_ago; -/* Someday compoundcmd_lineno will be an array of these structs. */ +/* compoundcmd_lineno is an array of these structs. This holds information + about the current compound command the parser is reading (token) and + where it begins (lineno). */ struct tokeninfo { int lineno; - int tok; + int token; }; /* The line number in a script where a compound command begins. The @@ -353,7 +355,7 @@ struct tokeninfo { This is a nested command maximum, since the array index is decremented after a compound command is parsed. */ #define MAX_COMPOUND_NEST 256 -static int compoundcmd_lineno[MAX_COMPOUND_NEST+1]; +static struct tokeninfo compoundcmd_lineno[MAX_COMPOUND_NEST+1]; static int compoundcmd_top = -1; /* If non-zero, it is the token that we want read_token to return @@ -890,45 +892,57 @@ shell_command: for_command for_command: FOR WORD newline_list DO compound_list DONE { - $$ = make_for_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $5, compoundcmd_lineno[compoundcmd_top]); + $$ = make_for_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $5, compoundcmd_lineno[compoundcmd_top].lineno); if (compoundcmd_top >= 0) compoundcmd_top--; } | FOR WORD newline_list '{' compound_list '}' { - $$ = make_for_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $5, compoundcmd_lineno[compoundcmd_top]); + int l; + l = (compoundcmd_top > 0) ? compoundcmd_lineno[compoundcmd_top - 1].lineno + : compoundcmd_lineno[compoundcmd_top].lineno; + $$ = make_for_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $5, l); if (compoundcmd_top >= 0) compoundcmd_top--; /* RBRACE */ if (compoundcmd_top >= 0) compoundcmd_top--; /* FOR */ } | FOR WORD ';' newline_list DO compound_list DONE { - $$ = make_for_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $6, compoundcmd_lineno[compoundcmd_top]); + $$ = make_for_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $6, compoundcmd_lineno[compoundcmd_top].lineno); if (compoundcmd_top >= 0) compoundcmd_top--; } | FOR WORD ';' newline_list '{' compound_list '}' { - $$ = make_for_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $6, compoundcmd_lineno[compoundcmd_top]); + int l; + l = (compoundcmd_top > 0) ? compoundcmd_lineno[compoundcmd_top - 1].lineno + : compoundcmd_lineno[compoundcmd_top].lineno; + $$ = make_for_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $6, l); if (compoundcmd_top >= 0) compoundcmd_top--; /* RBRACE */ if (compoundcmd_top >= 0) compoundcmd_top--; /* FOR */ } | FOR WORD newline_list IN word_list list_terminator newline_list DO compound_list DONE { - $$ = make_for_command ($2, REVERSE_LIST ($5, WORD_LIST *), $9, compoundcmd_lineno[compoundcmd_top]); + $$ = make_for_command ($2, REVERSE_LIST ($5, WORD_LIST *), $9, compoundcmd_lineno[compoundcmd_top].lineno); if (compoundcmd_top >= 0) compoundcmd_top--; } | FOR WORD newline_list IN word_list list_terminator newline_list '{' compound_list '}' { - $$ = make_for_command ($2, REVERSE_LIST ($5, WORD_LIST *), $9, compoundcmd_lineno[compoundcmd_top]); + int l; + l = (compoundcmd_top > 0) ? compoundcmd_lineno[compoundcmd_top - 1].lineno + : compoundcmd_lineno[compoundcmd_top].lineno; + $$ = make_for_command ($2, REVERSE_LIST ($5, WORD_LIST *), $9, l); if (compoundcmd_top >= 0) compoundcmd_top--; /* RBRACE */ if (compoundcmd_top >= 0) compoundcmd_top--; /* FOR */ } | FOR WORD newline_list IN list_terminator newline_list DO compound_list DONE { - $$ = make_for_command ($2, (WORD_LIST *)NULL, $8, compoundcmd_lineno[compoundcmd_top]); + $$ = make_for_command ($2, (WORD_LIST *)NULL, $8, compoundcmd_lineno[compoundcmd_top].lineno); if (compoundcmd_top >= 0) compoundcmd_top--; } | FOR WORD newline_list IN list_terminator newline_list '{' compound_list '}' { - $$ = make_for_command ($2, (WORD_LIST *)NULL, $8, compoundcmd_lineno[compoundcmd_top]); + int l; + l = (compoundcmd_top > 0) ? compoundcmd_lineno[compoundcmd_top - 1].lineno + : compoundcmd_lineno[compoundcmd_top].lineno; + $$ = make_for_command ($2, (WORD_LIST *)NULL, $8, l); if (compoundcmd_top >= 0) compoundcmd_top--; /* RBRACE */ if (compoundcmd_top >= 0) compoundcmd_top--; /* FOR */ } @@ -964,45 +978,57 @@ arith_for_command: FOR ARITH_FOR_EXPRS list_terminator newline_list DO compound_ select_command: SELECT WORD newline_list DO compound_list DONE { - $$ = make_select_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $5, compoundcmd_lineno[compoundcmd_top]); + $$ = make_select_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $5, compoundcmd_lineno[compoundcmd_top].lineno); if (compoundcmd_top >= 0) compoundcmd_top--; } | SELECT WORD newline_list '{' compound_list '}' { - $$ = make_select_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $5, compoundcmd_lineno[compoundcmd_top]); + int l; + l = (compoundcmd_top > 0) ? compoundcmd_lineno[compoundcmd_top - 1].lineno + : compoundcmd_lineno[compoundcmd_top].lineno; + $$ = make_select_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $5, l); if (compoundcmd_top >= 0) compoundcmd_top--; /* RBRACE */ if (compoundcmd_top >= 0) compoundcmd_top--; /* SELECT */ } | SELECT WORD ';' newline_list DO compound_list DONE { - $$ = make_select_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $6, compoundcmd_lineno[compoundcmd_top]); + $$ = make_select_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $6, compoundcmd_lineno[compoundcmd_top].lineno); if (compoundcmd_top >= 0) compoundcmd_top--; } | SELECT WORD ';' newline_list '{' compound_list '}' { - $$ = make_select_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $6, compoundcmd_lineno[compoundcmd_top]); + int l; + l = (compoundcmd_top > 0) ? compoundcmd_lineno[compoundcmd_top - 1].lineno + : compoundcmd_lineno[compoundcmd_top].lineno; + $$ = make_select_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $6, l); if (compoundcmd_top >= 0) compoundcmd_top--; /* RBRACE */ if (compoundcmd_top >= 0) compoundcmd_top--; /* SELECT */ } | SELECT WORD newline_list IN word_list list_terminator newline_list DO compound_list DONE { - $$ = make_select_command ($2, REVERSE_LIST ($5, WORD_LIST *), $9, compoundcmd_lineno[compoundcmd_top]); + $$ = make_select_command ($2, REVERSE_LIST ($5, WORD_LIST *), $9, compoundcmd_lineno[compoundcmd_top].lineno); if (compoundcmd_top >= 0) compoundcmd_top--; } | SELECT WORD newline_list IN word_list list_terminator newline_list '{' compound_list '}' { - $$ = make_select_command ($2, REVERSE_LIST ($5, WORD_LIST *), $9, compoundcmd_lineno[compoundcmd_top]); + int l; + l = (compoundcmd_top > 0) ? compoundcmd_lineno[compoundcmd_top - 1].lineno + : compoundcmd_lineno[compoundcmd_top].lineno; + $$ = make_select_command ($2, REVERSE_LIST ($5, WORD_LIST *), $9, l); if (compoundcmd_top >= 0) compoundcmd_top--; /* RBRACE */ if (compoundcmd_top >= 0) compoundcmd_top--; /* SELECT */ } | SELECT WORD newline_list IN list_terminator newline_list DO compound_list DONE { - $$ = make_select_command ($2, (WORD_LIST *)NULL, $8, compoundcmd_lineno[compoundcmd_top]); + $$ = make_select_command ($2, (WORD_LIST *)NULL, $8, compoundcmd_lineno[compoundcmd_top].lineno); if (compoundcmd_top >= 0) compoundcmd_top--; } | SELECT WORD newline_list IN list_terminator newline_list '{' compound_list '}' { - $$ = make_select_command ($2, (WORD_LIST *)NULL, $8, compoundcmd_lineno[compoundcmd_top]); + int l; + l = (compoundcmd_top > 0) ? compoundcmd_lineno[compoundcmd_top - 1].lineno + : compoundcmd_lineno[compoundcmd_top].lineno; + $$ = make_select_command ($2, (WORD_LIST *)NULL, $8, l); if (compoundcmd_top >= 0) compoundcmd_top--; /* RBRACE */ if (compoundcmd_top >= 0) compoundcmd_top--; /* SELECT */ } @@ -1010,17 +1036,17 @@ select_command: SELECT WORD newline_list DO compound_list DONE case_command: CASE WORD newline_list IN newline_list ESAC { - $$ = make_case_command ($2, (PATTERN_LIST *)NULL, compoundcmd_lineno[compoundcmd_top]); + $$ = make_case_command ($2, (PATTERN_LIST *)NULL, compoundcmd_lineno[compoundcmd_top].lineno); if (compoundcmd_top >= 0) compoundcmd_top--; } | CASE WORD newline_list IN case_clause_sequence newline_list ESAC { - $$ = make_case_command ($2, $5, compoundcmd_lineno[compoundcmd_top]); + $$ = make_case_command ($2, $5, compoundcmd_lineno[compoundcmd_top].lineno); if (compoundcmd_top >= 0) compoundcmd_top--; } | CASE WORD newline_list IN case_clause ESAC { - $$ = make_case_command ($2, $5, compoundcmd_lineno[compoundcmd_top]); + $$ = make_case_command ($2, $5, compoundcmd_lineno[compoundcmd_top].lineno); if (compoundcmd_top >= 0) compoundcmd_top--; } ; @@ -4870,7 +4896,7 @@ parse_dparen (int c) #if defined (ARITH_FOR_COMMAND) if (last_read_token == FOR) { - arith_for_lineno = compoundcmd_top[compoundcmd_lineno]; + arith_for_lineno = compoundcmd_top[compoundcmd_lineno].lineno; cmdtyp = parse_arith_cmd (&wval, 0); if (cmdtyp == 1) { @@ -5842,7 +5868,8 @@ set_compoundcmd_top (int t) case COND_START: if (compoundcmd_top < MAX_COMPOUND_NEST) compoundcmd_top++; - compoundcmd_lineno[compoundcmd_top] = line_number; + compoundcmd_lineno[compoundcmd_top].lineno = line_number; + compoundcmd_lineno[compoundcmd_top].token = t; break; default: break; @@ -6790,10 +6817,10 @@ report_syntax_error (const char *message) free (msg); msg = p; } -if (shell_eof_token && current_token != shell_eof_token) - parser_error (line_number, _("syntax error near unexpected token `%s' while looking for matching `%c'"), msg, shell_eof_token); -else - parser_error (line_number, _("syntax error near unexpected token `%s'"), msg); + if (shell_eof_token && current_token != shell_eof_token) + parser_error (line_number, _("syntax error near unexpected token `%s' while looking for matching `%c'"), msg, shell_eof_token); + else + parser_error (line_number, _("syntax error near unexpected token `%s'"), msg); free (msg); if (interactive == 0) @@ -6825,7 +6852,16 @@ else if (EOF_Reached && shell_eof_token && current_token != shell_eof_token) parser_error (line_number, _("unexpected EOF while looking for matching `%c'"), shell_eof_token); else if (EOF_Reached && compoundcmd_top >= 0) - parser_error (line_number, _("syntax error: unexpected end of file from command on line %d"), compoundcmd_lineno[compoundcmd_top]); + { + char *x; + x = find_token_in_alist (compoundcmd_lineno[compoundcmd_top].token, word_token_alist, 1); + if (x == 0) + x = find_token_in_alist (compoundcmd_lineno[compoundcmd_top].token, other_token_alist, 1); + if (x) + parser_error (line_number, _("syntax error: unexpected end of file from `%s' command on line %d"), x, compoundcmd_lineno[compoundcmd_top].lineno); + else + parser_error (line_number, _("syntax error: unexpected end of file from command on line %d"), compoundcmd_lineno[compoundcmd_top].lineno); + } else { msg = EOF_Reached ? _("syntax error: unexpected end of file") : _("syntax error"); diff --git a/shell.h b/shell.h index 106e800f..74d6fd97 100644 --- a/shell.h +++ b/shell.h @@ -110,6 +110,7 @@ extern int subshell_environment; extern int current_command_number; extern int indirection_level; extern int shell_compatibility_level; +extern const int default_compatibility_level; extern int running_under_emacs; extern int pretty_print_mode; diff --git a/stringlib.c b/stringlib.c index 1aa7abe6..190f36bf 100644 --- a/stringlib.c +++ b/stringlib.c @@ -70,7 +70,9 @@ find_string_in_alist (char *string, STRING_INT_ALIST *alist, int flags) /* Find TOKEN in ALIST, a list of string/int value pairs. Return the corresponding string. Allocates memory for the returned - string. FLAGS is currently ignored, but reserved. */ + string. FLAGS == 0 means to allocate new memory, the existing + behavior. If FLAGS&1, we just return the token and expect the caller + to allocate new memory and save it, if necessary. */ char * find_token_in_alist (int token, STRING_INT_ALIST *alist, int flags) { @@ -79,7 +81,7 @@ find_token_in_alist (int token, STRING_INT_ALIST *alist, int flags) for (i = 0; alist[i].word; i++) { if (alist[i].token == token) - return (savestring (alist[i].word)); + return (flags ? alist[i].word : savestring (alist[i].word)); } return (NULL); } diff --git a/support/Makefile.in b/support/Makefile.in index f7de7ac2..28fa610e 100644 --- a/support/Makefile.in +++ b/support/Makefile.in @@ -46,7 +46,6 @@ PROFILE_FLAGS = @PROFILE_FLAGS@ CFLAGS = @CFLAGS@ CFLAGS_FOR_BUILD = @CFLAGS_FOR_BUILD@ -BASE_CFLAGS_FOR_BUILD = @BASE_CFLAGS_FOR_BUILD@ CPPFLAGS = @CPPFLAGS@ CPPFLAGS_FOR_BUILD = @CPPFLAGS_FOR_BUILD@ LOCAL_CFLAGS = @LOCAL_CFLAGS@ @@ -63,7 +62,7 @@ LDFLAGS_FOR_BUILD = @LDFLAGS_FOR_BUILD@ $(LOCAL_LDFLAGS) $(CFLAGS_FOR_BUILD) INCLUDES = -I${BUILD_DIR} -I${topdir} -BASE_CCFLAGS = ${PROFILE_FLAGS} $(DEFS) $(LOCAL_DEFS) $(SYSTEM_FLAGS) \ +BASE_CCFLAGS = ${PROFILE_FLAGS} $(DEFS) $(LOCAL_DEFS) \ ${INCLUDES} $(STYLE_CFLAGS) $(LOCAL_CFLAGS) CCFLAGS = $(BASE_CCFLAGS) $(CPPFLAGS) $(CFLAGS) diff --git a/tests/cond.right b/tests/cond.right index 215a5514..da3a2bb2 100644 --- a/tests/cond.right +++ b/tests/cond.right @@ -154,9 +154,9 @@ ok 6 ok 7 ok 8 bash: -c: line 1: unexpected token `EOF', expected `)' -bash: -c: line 2: syntax error: unexpected end of file from command on line 1 +bash: -c: line 2: syntax error: unexpected end of file from `[[' command on line 1 bash: -c: line 1: unexpected EOF while looking for `]]' -bash: -c: line 2: syntax error: unexpected end of file from command on line 1 +bash: -c: line 2: syntax error: unexpected end of file from `[[' command on line 1 bash: -c: line 1: syntax error in conditional expression: unexpected token `]' bash: -c: line 1: syntax error near `]' bash: -c: line 1: `[[ ( -t X ) ]' diff --git a/tests/errors.right b/tests/errors.right index 1f118e77..f46ebb11 100644 --- a/tests/errors.right +++ b/tests/errors.right @@ -240,7 +240,7 @@ after non-special builtin: 1 ./errors7.sub: line 27: x: readonly variable ./errors7.sub: line 29: x: readonly variable ./errors7.sub: line 32: v: readonly variable -./errors8.sub: eval: line 7: syntax error: unexpected end of file from command on line 6 +./errors8.sub: eval: line 7: syntax error: unexpected end of file from `(' command on line 6 ok 1 ./errors8.sub: line 8: v: readonly variable ok 2 @@ -330,11 +330,11 @@ bash: line 1: readonly: `AA[4]': not a valid identifier array: 1 sh: line 1: export: `AA[4]': not a valid identifier sh: line 1: readonly: `AA[4]': not a valid identifier -bash: -c: line 5: syntax error: unexpected end of file from command on line 1 -bash: -c: line 3: syntax error: unexpected end of file from command on line 1 -bash: -c: line 4: syntax error: unexpected end of file from command on line 1 -bash: -c: line 5: syntax error: unexpected end of file from command on line 1 -bash: -c: line 7: syntax error: unexpected end of file from command on line 1 +bash: -c: line 5: syntax error: unexpected end of file from `if' command on line 1 +bash: -c: line 3: syntax error: unexpected end of file from `while' command on line 1 +bash: -c: line 4: syntax error: unexpected end of file from `until' command on line 1 +bash: -c: line 5: syntax error: unexpected end of file from `for' command on line 1 +bash: -c: line 7: syntax error: unexpected end of file from `case' command on line 1 bash: line 1: return: can only `return' from a function or sourced script after return bash: line 1: return: can only `return' from a function or sourced script diff --git a/tests/exportfunc.right b/tests/exportfunc.right index fa3decd3..32e26308 100644 --- a/tests/exportfunc.right +++ b/tests/exportfunc.right @@ -1,7 +1,7 @@ exportfunc ok 1 exportfunc ok 2 ./exportfunc.tests: line 37: cve7169-bad: No such file or directory -./exportfunc.tests: eval: line 44: syntax error: unexpected end of file from command on line 42 +./exportfunc.tests: eval: line 44: syntax error: unexpected end of file from `{' command on line 42 ./exportfunc.tests: line 43: cve7169-bad2: No such file or directory ./exportfunc1.sub: line 14: maximum here-document count exceeded ./exportfunc.tests: line 72: HELLO_WORLD: No such file or directory diff --git a/tests/heredoc.right b/tests/heredoc.right index 29e4ed07..214ef520 100644 --- a/tests/heredoc.right +++ b/tests/heredoc.right @@ -95,7 +95,7 @@ hello \END end hello\END ./heredoc3.sub: line 98: warning: here-document at line 96 delimited by end-of-file (wanted `EOF') -./heredoc3.sub: line 99: syntax error: unexpected end of file from command on line 96 +./heredoc3.sub: line 99: syntax error: unexpected end of file from `(' command on line 96 heredoc1 EOF Ok:0 diff --git a/variables.c b/variables.c index 3c9e2907..f1f7f511 100644 --- a/variables.c +++ b/variables.c @@ -6443,14 +6443,14 @@ sv_shcompat (const char *name) v = find_variable (name); if (v == 0) { - shell_compatibility_level = DEFAULT_COMPAT_LEVEL; + shell_compatibility_level = default_compatibility_level; set_compatibility_opts (); return; } val = value_cell (v); if (val == 0 || *val == '\0') { - shell_compatibility_level = DEFAULT_COMPAT_LEVEL; + shell_compatibility_level = default_compatibility_level; set_compatibility_opts (); return; } @@ -6477,7 +6477,7 @@ compat_error: return; } - if (compatval < MIN_COMPAT_LEVEL || compatval > DEFAULT_COMPAT_LEVEL) + if (compatval < MIN_COMPAT_LEVEL || compatval > default_compatibility_level) goto compat_error; shell_compatibility_level = compatval; diff --git a/version.c b/version.c index 549e74ae..6e585012 100644 --- a/version.c +++ b/version.c @@ -51,6 +51,7 @@ const char * const bash_copyright = N_("Copyright (C) 2024 Free Software Foundat const char * const bash_license = N_("License GPLv3+: GNU GPL version 3 or later \n"); /* If == 31, shell compatible with bash-3.1, == 32 with bash-3.2, and so on */ +const int default_compatibility_level = DEFAULT_COMPAT_LEVEL; int shell_compatibility_level = DEFAULT_COMPAT_LEVEL; /* Functions for getting, setting, and displaying the shell version. */