From fc132f73d13a3667dea60a46939c1f351fcc047b Mon Sep 17 00:00:00 2001 From: Chet Ramey Date: Mon, 12 Feb 2018 16:39:59 -0500 Subject: [PATCH] commit bash-20180209 snapshot --- CWRU/CWRU.chlog | 28 ++++++++++++++++++++++++++++ doc/bash.1 | 30 +++++++++++++++--------------- eval.c | 14 ++++++++++---- include/typemax.h | 17 +++++++++++++---- jobs.c | 23 +++++++++++++++++------ lib/readline/doc/hsuser.texi | 4 ++-- lib/readline/doc/readline.3 | 4 ++-- lib/readline/readline.c | 2 +- lib/readline/text.c | 1 + redir.c | 6 +++++- 10 files changed, 94 insertions(+), 35 deletions(-) diff --git a/CWRU/CWRU.chlog b/CWRU/CWRU.chlog index 5d6eec63..bd8f7ce7 100644 --- a/CWRU/CWRU.chlog +++ b/CWRU/CWRU.chlog @@ -14927,3 +14927,31 @@ config-top.h - DONT_REPORT_SIGPIPE: define, so non-interactive shells will no longer print termination messages for child processes killed by SIGTERM + + 2/6 + --- +lib/readline/text.c + - rl_insert: don't attempt to optimize typeahead if we are only reading + a fixed number of characters (rl_num_chars_to_read > 0) + +redir.c + - redir_special_open: if the shell is restricted, return a + RESTRICTED_REDIRECT error for attempts to open /dev/tcp and /dev/udp + sockets. Inspired by report from Blake Burkhart + - do_redirection_internal: if redir_open returns RESTRICTED_REDIRECT, + return that right away (instead of errno) so we can print a better + error message + + 2/11 + ---- +jobs.c + - bgp_resize: fix problems with (pid_t) overflow when calculating new + size for table when js.c_childmax is near the limit of a pid_t + (e.g., 2**31 - 1 on a 32-bit system, or 2**63-1 on a system with + 32-bit pid_t). Fixes hang reported by Natanael Copa + based on his patch from 12/8. + - bgp_resize: cap max table size for bgpids at MAX_CHILD_MAX (32768) + +include/typemax.h + - TYPE_MINIMUM, TYPE_MAXIMUM: updated definitions from coreutils-8.29, + silences some compiler warnings diff --git a/doc/bash.1 b/doc/bash.1 index aa77e883..ea00f6bd 100644 --- a/doc/bash.1 +++ b/doc/bash.1 @@ -2133,7 +2133,7 @@ A value of .I ignoreboth is shorthand for \fIignorespace\fP and \fIignoredups\fP. A value of -.IR erasedups +.I erasedups causes all previous lines matching the current line to be removed from the history list before that line is saved. Any value not in the above list is ignored. @@ -2794,7 +2794,7 @@ lexicographically between \fIx\fP and \fIy\fP, inclusive, using the default C locale. Note that both \fIx\fP and \fIy\fP must be of the same type. When the increment is supplied, it is used as the difference between -each term. The default increment is 1 or -1 as appropriate. +each term. The default increment is 1 or \-1 as appropriate. .PP Brace expansion is performed before any other expansions, and any characters special to other expansions are preserved @@ -3042,7 +3042,7 @@ one space to avoid being confused with the \fB:-\fP expansion. If \fIparameter\fP is \fB@\fP, the result is \fIlength\fP positional parameters beginning at \fIoffset\fP. A negative \fIoffset\fP is taken relative to one greater than the greatest -positional parameter, so an offset of -1 evaluates to the last positional +positional parameter, so an offset of \-1 evaluates to the last positional parameter. It is an expansion error if \fIlength\fP evaluates to a number less than zero. @@ -3439,7 +3439,7 @@ are ignored at the beginning and end of the word, as long as the whitespace character is in the value of .SM -.BR IFS +.B IFS (an .SM .B IFS @@ -4423,7 +4423,7 @@ A shell variable that is null or unset evaluates to 0 when referenced by name without using the parameter expansion syntax. The value of a variable is evaluated as an arithmetic expression when it is referenced, or when a variable which has been given the -\fIinteger\fP attribute using \fBdeclare -i\fP is assigned a value. +\fIinteger\fP attribute using \fBdeclare \-i\fP is assigned a value. A null value evaluates to 0. A shell variable need not have its \fIinteger\fP attribute turned on to be used in an expression. @@ -5633,13 +5633,13 @@ in emacs mode and to .B # in vi command mode. .TP -.B completion\-display\-width (-1) +.B completion\-display\-width (\-1) The number of screen columns used to display possible matches when performing completion. The value is ignored if it is less than 0 or greater than the terminal screen width. A value of 0 will cause matches to be displayed one per line. -The default value is -1. +The default value is \-1. .TP .B completion\-ignore\-case (Off) If set to \fBOn\fP, readline performs filename matching and completion @@ -6805,7 +6805,7 @@ of the setting of the \fBmark-symlinked\-directories\fP readline variable. .PP There is some support for dynamically modifying completions. This is most useful when used in combination with a default completion specified -with \fBcomplete -D\fP. +with \fBcomplete \-D\fP. It's possible for shell functions executed as completion handlers to indicate that completion should be retried by returning an exit status of 124. If a shell function returns 124, and changes @@ -6962,7 +6962,7 @@ for information on setting and unsetting shell options. .PP The shell supports a history expansion feature that is similar to the history expansion in -.BR csh. +.BR csh . This section describes what syntax features are available. This feature is enabled by default for interactive shells, and can be disabled using the @@ -8289,7 +8289,7 @@ with that string) or as a number (an index into the history list, where a negative number is used as an offset from the current command number). If .I last -is not specified it is set to +is not specified, it is set to the current command for listing (so that .if n ``fc \-l \-10'' .if t \f(CWfc \-l \-10\fP @@ -8298,7 +8298,7 @@ prints the last 10 commands) and to otherwise. If .I first -is not specified it is set to the previous +is not specified, it is set to the previous command for editing and \-16 for listing. .sp 1 The @@ -8802,7 +8802,7 @@ Exit a login shell. Read lines from the standard input into the indexed array variable .IR array , or from file descriptor -.IR fd +.I fd if the .B \-u option is supplied. @@ -8951,9 +8951,9 @@ causes \fBprintf\fP to output the date-time string resulting from using \fIdatefmt\fP as a format string for \fIstrftime\fP(3). The corresponding \fIargument\fP is an integer representing the number of seconds since the epoch. -Two special argument values may be used: -1 represents the current -time, and -2 represents the time the shell was invoked. -If no argument is specified, conversion behaves as if -1 had been given. +Two special argument values may be used: \-1 represents the current +time, and \-2 represents the time the shell was invoked. +If no argument is specified, conversion behaves as if \-1 had been given. This is an exception to the usual \fBprintf\fP behavior. .PD .PP diff --git a/eval.c b/eval.c index 7992346a..3104bffe 100644 --- a/eval.c +++ b/eval.c @@ -261,6 +261,15 @@ send_pwd_to_eterm () free (f); } +static void +execute_prompt_command () +{ + char *command_to_execute; + + command_to_execute = get_string_value ("PROMPT_COMMAND"); + if (command_to_execute) + execute_variable_command (command_to_execute, "PROMPT_COMMAND"); +} /* Call the YACC-generated parser and return the status of the parse. Input is read from the current input stream (bash_input). yyparse leaves the parsed command in the global variable GLOBAL_COMMAND. @@ -269,7 +278,6 @@ int parse_command () { int r; - char *command_to_execute; need_here_doc = 0; run_pending_traps (); @@ -282,9 +290,7 @@ parse_command () actually printed. */ if (interactive && bash_input.type != st_string && parser_expanding_alias() == 0) { - command_to_execute = get_string_value ("PROMPT_COMMAND"); - if (command_to_execute) - execute_variable_command (command_to_execute, "PROMPT_COMMAND"); + execute_prompt_command (); if (running_under_emacs == 2) send_pwd_to_eterm (); /* Yuck */ diff --git a/include/typemax.h b/include/typemax.h index aa21c9c6..0f696388 100644 --- a/include/typemax.h +++ b/include/typemax.h @@ -35,14 +35,23 @@ # define TYPE_SIGNED(t) (! ((t) 0 < (t) -1)) #endif +#ifndef TYPE_SIGNED_MAGNITUDE +# define TYPE_SIGNED_MAGNITUDE(t) ((t) ~ (t) 0 < (t) -1) +#endif + +#ifndef TYPE_WIDTH +# define TYPE_WIDTH(t) (sizeof (t) * CHAR_BIT) +#endif + #ifndef TYPE_MINIMUM -# define TYPE_MINIMUM(t) ((t) (TYPE_SIGNED (t) \ - ? ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1) \ - : (t) 0)) +# define TYPE_MINIMUM(t) ((t) ~ TYPE_MAXIMUM (t)) #endif #ifndef TYPE_MAXIMUM -# define TYPE_MAXIMUM(t) ((t) (~ (t) 0 - TYPE_MINIMUM (t))) +# define TYPE_MAXIMUM(t) \ + ((t) (! TYPE_SIGNED (t) \ + ? (t) -1 \ + : ((((t) 1 << (TYPE_WIDTH (t) - 2)) - 1) * 2 + 1))) #endif #ifdef HAVE_LONG_LONG diff --git a/jobs.c b/jobs.c index eff3fefa..8e51fa9b 100644 --- a/jobs.c +++ b/jobs.c @@ -73,6 +73,8 @@ #include "execute_cmd.h" #include "flags.h" +#include "typemax.h" + #include "builtins/builtext.h" #include "builtins/common.h" @@ -93,7 +95,7 @@ extern int killpg __P((pid_t, int)); #endif #if !MAX_CHILD_MAX -# define MAX_CHILD_MAX 8192 +# define MAX_CHILD_MAX 32768 #endif #if !defined (DEBUG) @@ -734,7 +736,7 @@ stop_pipeline (async, deferred) static void bgp_resize () { - ps_index_t nsize; + ps_index_t nsize, nsize_cur, nsize_max; ps_index_t psi; if (bgpids.nalloc == 0) @@ -748,10 +750,19 @@ bgp_resize () else nsize = bgpids.nalloc; - while (nsize < (ps_index_t)js.c_childmax) - nsize *= 2; + nsize_max = TYPE_MAXIMUM (ps_index_t); + nsize_cur = (ps_index_t)js.c_childmax; + if (nsize_cur < 0) /* overflow */ + nsize_cur = MAX_CHILD_MAX; - if (bgpids.nalloc < js.c_childmax) + while (nsize > 0 && nsize < nsize_cur) /* > 0 should catch overflow */ + nsize <<= 1; + if (nsize > nsize_max || nsize <= 0) /* overflow? */ + nsize = nsize_max; + if (nsize > MAX_CHILD_MAX) + nsize = nsize_max = MAX_CHILD_MAX; /* hard cap */ + + if (bgpids.nalloc < nsize_cur && bgpids.nalloc < nsize_max) { bgpids.storage = (struct pidstat *)xrealloc (bgpids.storage, nsize * sizeof (struct pidstat)); @@ -768,7 +779,7 @@ bgp_resize () static ps_index_t bgp_getindex () { - if (bgpids.nalloc < js.c_childmax || bgpids.head >= bgpids.nalloc) + if (bgpids.nalloc < (ps_index_t)js.c_childmax || bgpids.head >= bgpids.nalloc) bgp_resize (); pshash_delindex (bgpids.head); /* XXX - clear before reusing */ diff --git a/lib/readline/doc/hsuser.texi b/lib/readline/doc/hsuser.texi index 1c25f813..d21f65d0 100644 --- a/lib/readline/doc/hsuser.texi +++ b/lib/readline/doc/hsuser.texi @@ -149,8 +149,8 @@ Both @var{first} and @var{last} may be specified as a string (to locate the most recent command beginning with that string) or as a number (an index into the history list, where a negative number is used as an offset from the -current command number). If @var{last} is not specified it is set to -@var{first}. If @var{first} is not specified it is set to the previous +current command number). If @var{last} is not specified, it is set to +@var{first}. If @var{first} is not specified, it is set to the previous command for editing and @minus{}16 for listing. If the @option{-l} flag is given, the commands are listed on standard output. The @option{-n} flag suppresses the command numbers when listing. The @option{-r} flag diff --git a/lib/readline/doc/readline.3 b/lib/readline/doc/readline.3 index 5b555dcf..c084c658 100644 --- a/lib/readline/doc/readline.3 +++ b/lib/readline/doc/readline.3 @@ -378,13 +378,13 @@ in emacs mode and to .B # in vi command mode. .TP -.B completion\-display\-width (-1) +.B completion\-display\-width (\-1) The number of screen columns used to display possible matches when performing completion. The value is ignored if it is less than 0 or greater than the terminal screen width. A value of 0 will cause matches to be displayed one per line. -The default value is -1. +The default value is \-1. .TP .B completion\-ignore\-case (Off) If set to \fBOn\fP, readline performs filename matching and completion diff --git a/lib/readline/readline.c b/lib/readline/readline.c index 64154c54..4842a02e 100644 --- a/lib/readline/readline.c +++ b/lib/readline/readline.c @@ -242,7 +242,7 @@ int rl_erase_empty_line = 0; /* Non-zero means to read only this many characters rather than up to a character bound to accept-line. */ -int rl_num_chars_to_read; +int rl_num_chars_to_read = 0; /* Line buffer and maintenance. */ char *rl_line_buffer = (char *)NULL; diff --git a/lib/readline/text.c b/lib/readline/text.c index 116a33b6..81de2a99 100644 --- a/lib/readline/text.c +++ b/lib/readline/text.c @@ -915,6 +915,7 @@ rl_insert (int count, int c) x = 0; n = (unsigned short)-2; while (_rl_optimize_typeahead && + rl_num_chars_to_read == 0 && (RL_ISSTATE (RL_STATE_INPUTPENDING|RL_STATE_MACROINPUT) == 0) && _rl_pushed_input_available () == 0 && _rl_input_queued (0) && diff --git a/redir.c b/redir.c index 7104a3a7..ebb2c635 100644 --- a/redir.c +++ b/redir.c @@ -578,6 +578,10 @@ redir_special_open (spec, filename, flags, mode, ri) #if defined (NETWORK_REDIRECTIONS) case RF_DEVTCP: case RF_DEVUDP: +#if defined (RESTRICTED_SHELL) + if (restricted) + return (RESTRICTED_REDIRECT); +#endif #if defined (HAVE_NETWORK) fd = netopen (filename); #else @@ -850,7 +854,7 @@ do_redirection_internal (redirect, flags) fd = redir_open (redirectee_word, redirect->flags, 0666, ri); free (redirectee_word); - if (fd == NOCLOBBER_REDIRECT) + if (fd == NOCLOBBER_REDIRECT || fd == RESTRICTED_REDIRECT) return (fd); if (fd < 0)