commit bash-20200603 snapshot

This commit is contained in:
Chet Ramey
2020-06-04 16:30:27 -04:00
parent 6ebfddbf2e
commit 32ba27b400
25 changed files with 349 additions and 190 deletions
+15
View File
@@ -238,6 +238,15 @@ yyy. When `test' is supplied four or more arguments, treat an argument that
zzz. There is no `compat50' shopt option. Changes to the shell compatibility
level should use the BASH_COMPAT variable.
aaaa. Redirection failures with compound commands are now treated as errors
that cause the shell to exit if `errexit' is enabled.
bbbb. Redirection failure error messages no longer expand the word in the
redirection again.
cccc. History expansion is no longer performed while parsing a here-document
inside a command substitution.
2. Changes to Readline
a. There are a number of fixes that were found as the result of fuzzing with
@@ -292,6 +301,9 @@ p. Readline only calls chown(2) on a newly-written history file if it really
q. Readline now behaves better when operate-and-get-next is used when the
history list is `full': when there are already $HISTSIZE entries.
r. Fixed a bug that could cause vi redo (`.') of a replace command not to work
correctly in the C or POSIX locale.
3. New Features in Bash
a. `bind -x' now supports different bindings for different editing modes and
@@ -415,6 +427,9 @@ mm. The associative array implementation can now dynamically increase the
nn. HISTFILE is now readonly in a restricted shell.
oo. The bash malloc now returns memory that is 16-byte aligned on 64-bit
systems.
4. New Features in Readline
a. If a second consecutive completion attempt produces matches where the first
+15
View File
@@ -238,6 +238,15 @@ yyy. When `test' is supplied four or more arguments, treat an argument that
zzz. There is no `compat50' shopt option. Changes to the shell compatibility
level should use the BASH_COMPAT variable.
aaaa. Redirection failures with compound commands are now treated as errors
that cause the shell to exit if `errexit' is enabled.
bbbb. Redirection failure error messages no longer expand the word in the
redirection again.
cccc. History expansion is no longer performed while parsing a here-document
inside a command substitution.
2. Changes to Readline
a. There are a number of fixes that were found as the result of fuzzing with
@@ -292,6 +301,9 @@ p. Readline only calls chown(2) on a newly-written history file if it really
q. Readline now behaves better when operate-and-get-next is used when the
history list is `full': when there are already $HISTSIZE entries.
r. Fixed a bug that could cause vi redo (`.') of a replace command not to work
correctly in the C or POSIX locale.
3. New Features in Bash
a. `bind -x' now supports different bindings for different editing modes and
@@ -415,6 +427,9 @@ mm. The associative array implementation can now dynamically increase the
nn. HISTFILE is now readonly in a restricted shell.
oo. The bash malloc now returns memory that is 16-byte aligned on 64-bit
systems.
4. New Features in Readline
a. If a second consecutive completion attempt produces matches where the first
+35
View File
@@ -8482,3 +8482,38 @@ redir.c
if appropriate. Free FN in any case, since do_redirection_internal
won't. Fix for double expansion of filename in certain redirections
reported by OÄuz <oguzismailuysal@gmail.com>
6/4
---
parse.y
- parse_comsub: while we're reading a here-document, don't perform any
history expansion (set history_expansion_inhibited). Fixes issue
reported by "ladyrick" <ladyrick@qq.com>
general.h,parse.y
- __P -> PARAMS
shell.c
- shellstart: struct timeval used to initialize shell starting time;
shell_start_time now initialized from shellstart.tv_sec
variables.c
- assign_seconds: reset shellstart to set shell starting time
pcomplete.c
- include posixtime.h instead of <sys/time.h>
lib/sh/{ufuncs,uconvert}.c
- include posixtime.h instead of the inline conditional includes
aclocal.m4
- BASH_STRUCT_TIMEVAL: convert to use AC_COMPILE_IFELSE instead of the
deprecated AC_HEADER_EGREP
posixtime.h
- struct timeval: if HAVE_TIMEVAL is not defined, provide a replacement
definition
lib/sh/gettimeofday.c
- gettimeofday: replacement function, so we don't have to use
HAVE_GETTIMEOFDAY in the rest of the code
+2
View File
@@ -405,6 +405,7 @@ lib/sh/fnxform.c f
lib/sh/fpurge.c f
lib/sh/getcwd.c f
lib/sh/getenv.c f
lib/sh/gettimeofday.c f
lib/sh/inet_aton.c f
lib/sh/input_avail.c f
lib/sh/itos.c f
@@ -1135,6 +1136,7 @@ tests/histexp3.sub f
tests/histexp4.sub f
tests/histexp5.sub f
tests/histexp6.sub f
tests/histexp7.sub f
tests/histexp.right f
tests/history.tests f
tests/history.right f
+2 -1
View File
@@ -231,7 +231,8 @@ SHLIB_SOURCE = ${SH_LIBSRC}/clktck.c ${SH_LIBSRC}/getcwd.c \
${SH_LIBSRC}/input_avail.c ${SH_LIBSRC}/mbscasecmp.c \
${SH_LIBSRC}/fnxform.c ${SH_LIBSRC}/unicode.c \
${SH_LIBSRC}/wcswidth.c ${SH_LIBSRC}/wcsnwidth.c \
${SH_LIBSRC}/shmbchar.c ${SH_LIBSRC}/utf8.c ${SH_LIBSRC}/random.c
${SH_LIBSRC}/shmbchar.c ${SH_LIBSRC}/utf8.c \
${SH_LIBSRC}/random.c ${SH_LIBSRC}/gettimeofday.c
SHLIB_LIB = -lsh
SHLIB_LIBNAME = libsh.a
+3
View File
@@ -125,6 +125,9 @@ mm. The associative array implementation can now dynamically increase the
nn. HISTFILE is now readonly in a restricted shell.
oo. The bash malloc now returns memory that is 16-byte aligned on 64-bit
systems.
2. New Features in Readline
a. If a second consecutive completion attempt produces matches where the first
+3
View File
@@ -125,6 +125,9 @@ mm. The associative array implementation can now dynamically increase the
nn. HISTFILE is now readonly in a restricted shell.
oo. The bash malloc now returns memory that is 16-byte aligned on 64-bit
systems.
2. New Features in Readline
a. If a second consecutive completion attempt produces matches where the first
Vendored
+11 -6
View File
@@ -1179,12 +1179,17 @@ fi
AC_DEFUN(BASH_STRUCT_TIMEVAL,
[AC_MSG_CHECKING(for struct timeval in sys/time.h and time.h)
AC_CACHE_VAL(bash_cv_struct_timeval,
[
AC_EGREP_HEADER(struct timeval, sys/time.h,
bash_cv_struct_timeval=yes,
AC_EGREP_HEADER(struct timeval, time.h,
bash_cv_struct_timeval=yes,
bash_cv_struct_timeval=no))
[AC_COMPILE_IFELSE(
[AC_LANG_PROGRAM(
[[#if HAVE_SYS_TIME_H
#include <sys/time.h>
#endif
#include <time.h>
]],
[[static struct timeval x; x.tv_sec = x.tv_usec;]]
)],
bash_cv_struct_timeval=yes,
bash_cv_struct_timeval=no)
])
AC_MSG_RESULT($bash_cv_struct_timeval)
if test $bash_cv_struct_timeval = yes; then
Vendored
+15 -19
View File
@@ -1,5 +1,5 @@
#! /bin/sh
# From configure.ac for Bash 5.1, version 5.017.
# From configure.ac for Bash 5.1, version 5.018.
# Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.69 for bash 5.1-alpha.
#
@@ -18068,32 +18068,28 @@ $as_echo_n "checking for struct timeval in sys/time.h and time.h... " >&6; }
if ${bash_cv_struct_timeval+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <sys/time.h>
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
$EGREP "struct timeval" >/dev/null 2>&1; then :
bash_cv_struct_timeval=yes
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <time.h>
#if HAVE_SYS_TIME_H
#include <sys/time.h>
#endif
#include <time.h>
int
main ()
{
static struct timeval x; x.tv_sec = x.tv_usec;
;
return 0;
}
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
$EGREP "struct timeval" >/dev/null 2>&1; then :
if ac_fn_c_try_compile "$LINENO"; then :
bash_cv_struct_timeval=yes
else
bash_cv_struct_timeval=no
fi
rm -f conftest*
fi
rm -f conftest*
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
+1 -1
View File
@@ -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 <http://www.gnu.org/licenses/>.
AC_REVISION([for Bash 5.1, version 5.017])dnl
AC_REVISION([for Bash 5.1, version 5.018])dnl
define(bashvers, 5.1)
define(relstatus, alpha)
+4 -2
View File
@@ -109,6 +109,9 @@ extern int errno;
extern int command_string_index;
extern char *the_printed_command;
extern time_t shell_start_time;
#if defined (HAVE_GETTIMEOFDAY)
extern struct timeval shellstart;
#endif
#if 0
extern char *glob_argv_flags;
#endif
@@ -1356,8 +1359,7 @@ time_command (command, asynchronous, pipe_in, pipe_out, fds_to_close)
#if defined (HAVE_GETRUSAGE)
selfb.ru_utime.tv_sec = kidsb.ru_utime.tv_sec = selfb.ru_stime.tv_sec = kidsb.ru_stime.tv_sec = 0;
selfb.ru_utime.tv_usec = kidsb.ru_utime.tv_usec = selfb.ru_stime.tv_usec = kidsb.ru_stime.tv_usec = 0;
before.tv_sec = shell_start_time;
before.tv_usec = 0;
before = shellstart;
#else
before.tms_utime = before.tms_stime = before.tms_cutime = before.tms_cstime = 0;
tbefore = shell_start_time;
+79 -79
View File
@@ -1,6 +1,6 @@
/* general.h -- defines that everybody likes to use. */
/* Copyright (C) 1993-2016 Free Software Foundation, Inc.
/* Copyright (C) 1993-2020 Free Software Foundation, Inc.
This file is part of GNU Bash, the Bourne Again SHell.
@@ -62,7 +62,7 @@ extern char *strchr (), *strrchr ();
#endif
#if !defined (strcpy) && (defined (HAVE_DECL_STRCPY) && !HAVE_DECL_STRCPY)
extern char *strcpy __P((char *, const char *));
extern char *strcpy PARAMS((char *, const char *));
#endif
#if !defined (savestring)
@@ -205,43 +205,43 @@ typedef char **CPPFunction (); /* no longer used */
/* Shell function typedefs with prototypes */
/* `Generic' function pointer typedefs */
typedef int sh_intfunc_t __P((int));
typedef int sh_ivoidfunc_t __P((void));
typedef int sh_icpfunc_t __P((char *));
typedef int sh_icppfunc_t __P((char **));
typedef int sh_iptrfunc_t __P((PTR_T));
typedef int sh_intfunc_t PARAMS((int));
typedef int sh_ivoidfunc_t PARAMS((void));
typedef int sh_icpfunc_t PARAMS((char *));
typedef int sh_icppfunc_t PARAMS((char **));
typedef int sh_iptrfunc_t PARAMS((PTR_T));
typedef void sh_voidfunc_t __P((void));
typedef void sh_vintfunc_t __P((int));
typedef void sh_vcpfunc_t __P((char *));
typedef void sh_vcppfunc_t __P((char **));
typedef void sh_vptrfunc_t __P((PTR_T));
typedef void sh_voidfunc_t PARAMS((void));
typedef void sh_vintfunc_t PARAMS((int));
typedef void sh_vcpfunc_t PARAMS((char *));
typedef void sh_vcppfunc_t PARAMS((char **));
typedef void sh_vptrfunc_t PARAMS((PTR_T));
typedef int sh_wdesc_func_t __P((WORD_DESC *));
typedef int sh_wlist_func_t __P((WORD_LIST *));
typedef int sh_wdesc_func_t PARAMS((WORD_DESC *));
typedef int sh_wlist_func_t PARAMS((WORD_LIST *));
typedef int sh_glist_func_t __P((GENERIC_LIST *));
typedef int sh_glist_func_t PARAMS((GENERIC_LIST *));
typedef char *sh_string_func_t __P((char *)); /* like savestring, et al. */
typedef char *sh_string_func_t PARAMS((char *)); /* like savestring, et al. */
typedef int sh_msg_func_t __P((const char *, ...)); /* printf(3)-like */
typedef void sh_vmsg_func_t __P((const char *, ...)); /* printf(3)-like */
typedef int sh_msg_func_t PARAMS((const char *, ...)); /* printf(3)-like */
typedef void sh_vmsg_func_t PARAMS((const char *, ...)); /* printf(3)-like */
/* Specific function pointer typedefs. Most of these could be done
with #defines. */
typedef void sh_sv_func_t __P((char *)); /* sh_vcpfunc_t */
typedef void sh_free_func_t __P((PTR_T)); /* sh_vptrfunc_t */
typedef void sh_resetsig_func_t __P((int)); /* sh_vintfunc_t */
typedef void sh_sv_func_t PARAMS((char *)); /* sh_vcpfunc_t */
typedef void sh_free_func_t PARAMS((PTR_T)); /* sh_vptrfunc_t */
typedef void sh_resetsig_func_t PARAMS((int)); /* sh_vintfunc_t */
typedef int sh_ignore_func_t __P((const char *)); /* sh_icpfunc_t */
typedef int sh_ignore_func_t PARAMS((const char *)); /* sh_icpfunc_t */
typedef int sh_assign_func_t __P((const char *));
typedef int sh_wassign_func_t __P((WORD_DESC *, int));
typedef int sh_assign_func_t PARAMS((const char *));
typedef int sh_wassign_func_t PARAMS((WORD_DESC *, int));
typedef int sh_load_func_t __P((char *));
typedef void sh_unload_func_t __P((char *));
typedef int sh_load_func_t PARAMS((char *));
typedef void sh_unload_func_t PARAMS((char *));
typedef int sh_builtin_func_t __P((WORD_LIST *)); /* sh_wlist_func_t */
typedef int sh_builtin_func_t PARAMS((WORD_LIST *)); /* sh_wlist_func_t */
#endif /* SH_FUNCTION_TYPEDEF */
@@ -295,77 +295,77 @@ typedef int QSFUNC ();
#if 0
/* Declarations for functions defined in xmalloc.c */
extern PTR_T xmalloc __P((size_t));
extern PTR_T xrealloc __P((void *, size_t));
extern void xfree __P((void *));
extern PTR_T xmalloc PARAMS((size_t));
extern PTR_T xrealloc PARAMS((void *, size_t));
extern void xfree PARAMS((void *));
#endif
/* Declarations for functions defined in general.c */
extern void posix_initialize __P((int));
extern void posix_initialize PARAMS((int));
extern int num_posix_options __P((void));
extern char *get_posix_options __P((char *));
extern void set_posix_options __P((const char *));
extern int num_posix_options PARAMS((void));
extern char *get_posix_options PARAMS((char *));
extern void set_posix_options PARAMS((const char *));
extern void save_posix_options __P((void));
extern void save_posix_options PARAMS((void));
#if defined (RLIMTYPE)
extern RLIMTYPE string_to_rlimtype __P((char *));
extern void print_rlimtype __P((RLIMTYPE, int));
extern RLIMTYPE string_to_rlimtype PARAMS((char *));
extern void print_rlimtype PARAMS((RLIMTYPE, int));
#endif
extern int all_digits __P((const char *));
extern int legal_number __P((const char *, intmax_t *));
extern int legal_identifier __P((const char *));
extern int importable_function_name __P((const char *, size_t));
extern int exportable_function_name __P((const char *));
extern int check_identifier __P((WORD_DESC *, int));
extern int valid_nameref_value __P((const char *, int));
extern int check_selfref __P((const char *, char *, int));
extern int legal_alias_name __P((const char *, int));
extern int line_isblank __P((const char *));
extern int assignment __P((const char *, int));
extern int all_digits PARAMS((const char *));
extern int legal_number PARAMS((const char *, intmax_t *));
extern int legal_identifier PARAMS((const char *));
extern int importable_function_name PARAMS((const char *, size_t));
extern int exportable_function_name PARAMS((const char *));
extern int check_identifier PARAMS((WORD_DESC *, int));
extern int valid_nameref_value PARAMS((const char *, int));
extern int check_selfref PARAMS((const char *, char *, int));
extern int legal_alias_name PARAMS((const char *, int));
extern int line_isblank PARAMS((const char *));
extern int assignment PARAMS((const char *, int));
extern int sh_unset_nodelay_mode __P((int));
extern int sh_setclexec __P((int));
extern int sh_validfd __P((int));
extern int fd_ispipe __P((int));
extern void check_dev_tty __P((void));
extern int move_to_high_fd __P((int, int, int));
extern int check_binary_file __P((const char *, int));
extern int sh_unset_nodelay_mode PARAMS((int));
extern int sh_setclexec PARAMS((int));
extern int sh_validfd PARAMS((int));
extern int fd_ispipe PARAMS((int));
extern void check_dev_tty PARAMS((void));
extern int move_to_high_fd PARAMS((int, int, int));
extern int check_binary_file PARAMS((const char *, int));
#ifdef _POSIXSTAT_H_
extern int same_file __P((const char *, const char *, struct stat *, struct stat *));
extern int same_file PARAMS((const char *, const char *, struct stat *, struct stat *));
#endif
extern int sh_openpipe __P((int *));
extern int sh_closepipe __P((int *));
extern int sh_openpipe PARAMS((int *));
extern int sh_closepipe PARAMS((int *));
extern int file_exists __P((const char *));
extern int file_isdir __P((const char *));
extern int file_iswdir __P((const char *));
extern int path_dot_or_dotdot __P((const char *));
extern int absolute_pathname __P((const char *));
extern int absolute_program __P((const char *));
extern int file_exists PARAMS((const char *));
extern int file_isdir PARAMS((const char *));
extern int file_iswdir PARAMS((const char *));
extern int path_dot_or_dotdot PARAMS((const char *));
extern int absolute_pathname PARAMS((const char *));
extern int absolute_program PARAMS((const char *));
extern char *make_absolute __P((const char *, const char *));
extern char *base_pathname __P((char *));
extern char *full_pathname __P((char *));
extern char *polite_directory_format __P((char *));
extern char *trim_pathname __P((char *, int));
extern char *printable_filename __P((char *, int));
extern char *make_absolute PARAMS((const char *, const char *));
extern char *base_pathname PARAMS((char *));
extern char *full_pathname PARAMS((char *));
extern char *polite_directory_format PARAMS((char *));
extern char *trim_pathname PARAMS((char *, int));
extern char *printable_filename PARAMS((char *, int));
extern char *extract_colon_unit __P((char *, int *));
extern char *extract_colon_unit PARAMS((char *, int *));
extern void tilde_initialize __P((void));
extern char *bash_tilde_find_word __P((const char *, int, int *));
extern char *bash_tilde_expand __P((const char *, int));
extern void tilde_initialize PARAMS((void));
extern char *bash_tilde_find_word PARAMS((const char *, int, int *));
extern char *bash_tilde_expand PARAMS((const char *, int));
extern int group_member __P((gid_t));
extern char **get_group_list __P((int *));
extern int *get_group_array __P((int *));
extern int group_member PARAMS((gid_t));
extern char **get_group_list PARAMS((int *));
extern int *get_group_array PARAMS((int *));
extern char *conf_standard_path __P((void));
extern int default_columns __P((void));
extern char *conf_standard_path PARAMS((void));
extern int default_columns PARAMS((void));
#endif /* _GENERAL_H_ */
+12
View File
@@ -46,4 +46,16 @@
# endif /* !CLK_TCK */
#endif /* !HAVE_SYSCONF && !_SC_CLK_TCK */
#if !HAVE_TIMEVAL
struct timeval
{
time_t tv_sec;
long int tv_usec;
};
#endif
#if !HAVE_GETTIMEOFDAY
extern int gettimeofday PARAMS((struct timeval *, void *));
#endif
#endif /* _POSIXTIME_H_ */
+5 -2
View File
@@ -93,7 +93,7 @@ CSOURCES = clktck.c clock.c getcwd.c getenv.c oslib.c setlinebuf.c \
wcsdup.c fpurge.c zgetline.c mbscmp.c uconvert.c ufuncs.c \
casemod.c dprintf.c input_avail.c mbscasecmp.c fnxform.c \
strchrnul.c unicode.c wcswidth.c wcsnwidth.c shmbchar.c strdup.c \
utf8.c random.c
utf8.c random.c gettimeofday.c
# The header files for this library.
HSOURCES =
@@ -108,7 +108,7 @@ OBJECTS = clktck.o clock.o getenv.o oslib.o setlinebuf.o strnlen.o \
fmtullong.o fmtumax.o zcatfd.o zmapfd.o winsize.o wcsdup.o \
fpurge.o zgetline.o mbscmp.o uconvert.o ufuncs.o casemod.o \
input_avail.o mbscasecmp.o fnxform.o unicode.o shmbchar.o \
utf8.o random.o wcsnwidth.o ${LIBOBJS}
utf8.o random.o gettimeofday.o wcsnwidth.o ${LIBOBJS}
SUPPORT = Makefile
@@ -155,6 +155,7 @@ fnxform.o: fnxform.c
fpurge.o: fpurge.c
getcwd.o: getcwd.c
getenv.o: getenv.c
gettimeofday.o: gettimeofday.c
inet_aton.o: inet_aton.c
input_avail.o: input_avail.c
itos.o: itos.c
@@ -234,6 +235,7 @@ fnxform.o: ${BUILD_DIR}/config.h
fpurge.o: ${BUILD_DIR}/config.h
getcwd.o: ${BUILD_DIR}/config.h
getenv.o: ${BUILD_DIR}/config.h
gettimeofday.o: ${BUILD_DIR}/config.h
inet_aton.o: ${BUILD_DIR}/config.h
input_avail.o: ${BUILD_DIR}/config.h
itos.o: ${BUILD_DIR}/config.h
@@ -511,6 +513,7 @@ times.o: ${BASHINCDIR}/systimes.h
times.o: ${BASHINCDIR}/posixtime.h
timeval.o: ${BASHINCDIR}/posixtime.h
gettimeofday.o: ${BASHINCDIR}/posixtime.h
tmpfile.o: ${topdir}/bashtypes.h
tmpfile.o: ${BASHINCDIR}/chartypes.h
+35
View File
@@ -0,0 +1,35 @@
/* gettimeofday.c - gettimeofday replacement using time() */
/* Copyright (C) 2020 Free Software Foundation, Inc.
This file is part of GNU Bash, the Bourne Again SHell.
Bash is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Bash is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Bash. If not, see <http://www.gnu.org/licenses/>.
*/
#include "config.h"
#if !defined (HAVE_GETTIMEOFDAY)
#include "posixtime.h"
/* A version of gettimeofday that just sets tv_sec from time(3) */
int
gettimeofday (struct timeval *tv, void *tz)
{
tv->tv_sec = (time_t) time ((time_t *)0);
tv->tv_usec = 0;
return 0;
}
#endif
+1 -1
View File
@@ -58,7 +58,7 @@ times(tms)
tms->tms_cutime = CONVTCK(ru.ru_utime);
tms->tms_cstime = CONVTCK(ru.ru_stime);
if (gettimeofday(&tv, (struct timezone *) 0) < 0)
if (gettimeofday(&tv, NULL) < 0)
return ((clock_t)-1);
rv = (clock_t)(CONVTCK(tv));
#else /* !HAVE_GETRUSAGE */
+1 -10
View File
@@ -23,16 +23,7 @@
#include "bashtypes.h"
#if defined (TIME_WITH_SYS_TIME)
# include <sys/time.h>
# include <time.h>
#else
# if defined (HAVE_SYS_TIME_H)
# include <sys/time.h>
# else
# include <time.h>
# endif
#endif
#include "posixtime.h"
#if defined (HAVE_UNISTD_H)
#include <unistd.h>
+2 -11
View File
@@ -1,6 +1,6 @@
/* ufuncs - sleep and alarm functions that understand fractional values */
/* Copyright (C) 2008,2009 Free Software Foundation, Inc.
/* Copyright (C) 2008,2009-2020 Free Software Foundation, Inc.
This file is part of GNU Bash, the Bourne Again SHell.
@@ -22,16 +22,7 @@
#include "bashtypes.h"
#if defined (TIME_WITH_SYS_TIME)
# include <sys/time.h>
# include <time.h>
#else
# if defined (HAVE_SYS_TIME_H)
# include <sys/time.h>
# else
# include <time.h>
# endif
#endif
#include "posixtime.h"
#if defined (HAVE_UNISTD_H)
#include <unistd.h>
+77 -53
View File
@@ -71,7 +71,7 @@
#if defined (JOB_CONTROL)
# include "jobs.h"
#else
extern int cleanup_dead_jobs __P((void));
extern int cleanup_dead_jobs PARAMS((void));
#endif /* JOB_CONTROL */
#if defined (ALIAS)
@@ -131,90 +131,90 @@ extern int errno;
/* **************************************************************** */
#ifdef DEBUG
static void debug_parser __P((int));
static void debug_parser PARAMS((int));
#endif
static int yy_getc __P((void));
static int yy_ungetc __P((int));
static int yy_getc PARAMS((void));
static int yy_ungetc PARAMS((int));
#if defined (READLINE)
static int yy_readline_get __P((void));
static int yy_readline_unget __P((int));
static int yy_readline_get PARAMS((void));
static int yy_readline_unget PARAMS((int));
#endif
static int yy_string_get __P((void));
static int yy_string_unget __P((int));
static void rewind_input_string __P((void));
static int yy_stream_get __P((void));
static int yy_stream_unget __P((int));
static int yy_string_get PARAMS((void));
static int yy_string_unget PARAMS((int));
static void rewind_input_string PARAMS((void));
static int yy_stream_get PARAMS((void));
static int yy_stream_unget PARAMS((int));
static int shell_getc __P((int));
static void shell_ungetc __P((int));
static void discard_until __P((int));
static int shell_getc PARAMS((int));
static void shell_ungetc PARAMS((int));
static void discard_until PARAMS((int));
#if defined (ALIAS) || defined (DPAREN_ARITHMETIC)
static void push_string __P((char *, int, alias_t *));
static void pop_string __P((void));
static void free_string_list __P((void));
static void push_string PARAMS((char *, int, alias_t *));
static void pop_string PARAMS((void));
static void free_string_list PARAMS((void));
#endif
static char *read_a_line __P((int));
static char *read_a_line PARAMS((int));
static int reserved_word_acceptable __P((int));
static int yylex __P((void));
static int reserved_word_acceptable PARAMS((int));
static int yylex PARAMS((void));
static void push_heredoc __P((REDIRECT *));
static char *mk_alexpansion __P((char *));
static int alias_expand_token __P((char *));
static int time_command_acceptable __P((void));
static int special_case_tokens __P((char *));
static int read_token __P((int));
static char *parse_matched_pair __P((int, int, int, int *, int));
static char *parse_comsub __P((int, int, int, int *, int));
static void push_heredoc PARAMS((REDIRECT *));
static char *mk_alexpansion PARAMS((char *));
static int alias_expand_token PARAMS((char *));
static int time_command_acceptable PARAMS((void));
static int special_case_tokens PARAMS((char *));
static int read_token PARAMS((int));
static char *parse_matched_pair PARAMS((int, int, int, int *, int));
static char *parse_comsub PARAMS((int, int, int, int *, int));
#if defined (ARRAY_VARS)
static char *parse_compound_assignment __P((int *));
static char *parse_compound_assignment PARAMS((int *));
#endif
#if defined (DPAREN_ARITHMETIC) || defined (ARITH_FOR_COMMAND)
static int parse_dparen __P((int));
static int parse_arith_cmd __P((char **, int));
static int parse_dparen PARAMS((int));
static int parse_arith_cmd PARAMS((char **, int));
#endif
#if defined (COND_COMMAND)
static void cond_error __P((void));
static COND_COM *cond_expr __P((void));
static COND_COM *cond_or __P((void));
static COND_COM *cond_and __P((void));
static COND_COM *cond_term __P((void));
static int cond_skip_newlines __P((void));
static COMMAND *parse_cond_command __P((void));
static void cond_error PARAMS((void));
static COND_COM *cond_expr PARAMS((void));
static COND_COM *cond_or PARAMS((void));
static COND_COM *cond_and PARAMS((void));
static COND_COM *cond_term PARAMS((void));
static int cond_skip_newlines PARAMS((void));
static COMMAND *parse_cond_command PARAMS((void));
#endif
#if defined (ARRAY_VARS)
static int token_is_assignment __P((char *, int));
static int token_is_ident __P((char *, int));
static int token_is_assignment PARAMS((char *, int));
static int token_is_ident PARAMS((char *, int));
#endif
static int read_token_word __P((int));
static void discard_parser_constructs __P((int));
static int read_token_word PARAMS((int));
static void discard_parser_constructs PARAMS((int));
static char *error_token_from_token __P((int));
static char *error_token_from_text __P((void));
static void print_offending_line __P((void));
static void report_syntax_error __P((char *));
static char *error_token_from_token PARAMS((int));
static char *error_token_from_text PARAMS((void));
static void print_offending_line PARAMS((void));
static void report_syntax_error PARAMS((char *));
static void handle_eof_input_unit __P((void));
static void prompt_again __P((void));
static void handle_eof_input_unit PARAMS((void));
static void prompt_again PARAMS((void));
#if 0
static void reset_readline_prompt __P((void));
static void reset_readline_prompt PARAMS((void));
#endif
static void print_prompt __P((void));
static void print_prompt PARAMS((void));
#if defined (HANDLE_MULTIBYTE)
static void set_line_mbstate __P((void));
static void set_line_mbstate PARAMS((void));
static char *shell_input_line_property = NULL;
static size_t shell_input_line_propsize = 0;
#else
# define set_line_mbstate()
#endif
extern int yyerror __P((const char *));
extern int yyerror PARAMS((const char *));
#ifdef DEBUG
extern int yydebug;
@@ -3905,7 +3905,7 @@ parse_comsub (qc, open, close, lenp, flags)
int *lenp, flags;
{
int count, ch, peekc, tflags, lex_rwlen, lex_wlen, lex_firstind;
int nestlen, ttranslen, start_lineno;
int nestlen, ttranslen, start_lineno, orig_histexp;
char *ret, *nestret, *ttrans, *heredelim;
int retind, retsize, rflags, hdlen;
@@ -3919,6 +3919,9 @@ parse_comsub (qc, open, close, lenp, flags)
/*itrace("parse_comsub: qc = `%c' open = %c close = %c", qc, open, close);*/
count = 1;
tflags = LEX_RESWDOK;
#if defined (BANG_HISTORY)
orig_histexp = history_expansion_inhibited;
#endif
if ((flags & P_COMMAND) && qc != '\'' && qc != '"' && (flags & P_DQUOTE) == 0)
tflags |= LEX_CKCASE;
@@ -3945,6 +3948,9 @@ comsub_readchar:
if (ch == EOF)
{
eof_error:
#if defined (BANG_HISTORY)
history_expansion_inhibited = orig_histexp;
#endif
free (ret);
FREE (heredelim);
parser_error (start_lineno, _("unexpected EOF while looking for matching `%c'"), close);
@@ -3963,6 +3969,9 @@ eof_error:
{
tflags &= ~LEX_HEREDELIM;
tflags |= LEX_INHEREDOC;
#if defined (BANG_HISTORY)
history_expansion_inhibited = 1;
#endif
lex_firstind = retind + 1;
}
else if (tflags & LEX_INHEREDOC)
@@ -3978,6 +3987,9 @@ eof_error:
free (heredelim);
heredelim = 0;
lex_firstind = -1;
#if defined (BANG_HISTORY)
history_expansion_inhibited = orig_histexp;
#endif
}
else
lex_firstind = retind + 1;
@@ -4012,6 +4024,9 @@ eof_error:
free (heredelim);
heredelim = 0;
lex_firstind = -1;
#if defined (BANG_HISTORY)
history_expansion_inhibited = orig_histexp;
#endif
}
}
@@ -4122,6 +4137,9 @@ eof_error:
tflags |= LEX_INHEREDOC;
tflags &= ~LEX_HEREDELIM;
lex_firstind = retind + 1;
#if defined (BANG_HISTORY)
history_expansion_inhibited = 1;
#endif
}
#endif
else if (lex_firstind >= 0 && (tflags & LEX_PASSNEXT) == 0 && shellbreak (ch))
@@ -4141,6 +4159,9 @@ eof_error:
tflags |= LEX_INHEREDOC;
tflags &= ~LEX_HEREDELIM;
lex_firstind = retind + 1;
#if defined (BANG_HISTORY)
history_expansion_inhibited = 1;
#endif
}
else
lex_firstind = -1;
@@ -4411,6 +4432,9 @@ eof_error:
tflags &= ~LEX_WASDOL;
}
#if defined (BANG_HISTORY)
history_expansion_inhibited = orig_histexp;
#endif
FREE (heredelim);
ret[retind] = '\0';
if (lenp)
+1 -1
View File
@@ -37,7 +37,7 @@
# include <varargs.h>
#endif
#include <sys/time.h>
#include "posixtime.h"
#include <stdio.h>
#include "bashansi.h"
+4 -1
View File
@@ -179,6 +179,7 @@ char *shell_name = (char *)NULL;
/* time in seconds when the shell was started */
time_t shell_start_time;
struct timeval shellstart;
/* Are we running in an emacs shell window? */
int running_under_emacs;
@@ -458,7 +459,9 @@ main (argc, argv, env)
shell_environment = env;
set_shell_name (argv[0]);
shell_start_time = NOW; /* NOW now defined in general.h */
gettimeofday (&shellstart, 0);
shell_start_time = shellstart.tv_sec;
/* Parse argument flags from the input line. */
+4
View File
@@ -240,3 +240,7 @@ echo two
1 echo two
2 for f in a b c; do echo echo two; done
3 history
a
echo !!
--between--
echo !!
+1
View File
@@ -155,3 +155,4 @@ ${THIS_SH} ./histexp3.sub
${THIS_SH} ./histexp4.sub
${THIS_SH} ./histexp5.sub
${THIS_SH} ./histexp6.sub
${THIS_SH} ./histexp7.sub
+18
View File
@@ -0,0 +1,18 @@
# make sure history expansion doesn't take place while parsing command
# substitutions
set -o history
set -o histexpand
echo a
echo $( cat <<EOF
echo !!
EOF
)
echo --between--
cat <( cat <<'EOF'
echo !!
EOF
)
+3 -3
View File
@@ -100,6 +100,7 @@ extern char **environ;
/* Variables used here and defined in other files. */
extern time_t shell_start_time;
extern struct timeval shellstart;
/* The list of shell variables that the user has created at the global
scope, or that came from the environment. */
@@ -1284,7 +1285,6 @@ assign_seconds (self, value, unused, key)
arrayind_t unused;
char *key;
{
struct timeval tv;
intmax_t nval;
int expok;
@@ -1293,8 +1293,8 @@ assign_seconds (self, value, unused, key)
else
expok = legal_number (value, &nval);
seconds_value_assigned = expok ? nval : 0;
gettimeofday (&tv, NULL);
shell_start_time = tv.tv_sec;
gettimeofday (&shellstart, NULL);
shell_start_time = shellstart.tv_sec;
return (self);
}