Skip to content

Commit

Permalink
commit bash-20190628 snapshot
Browse files Browse the repository at this point in the history
  • Loading branch information
Chet Ramey committed Jul 1, 2019
1 parent 602eae4 commit 951bdaa
Show file tree
Hide file tree
Showing 15 changed files with 158 additions and 58 deletions.
34 changes: 34 additions & 0 deletions CWRU/CWRU.chlog
Original file line number Diff line number Diff line change
Expand Up @@ -6167,3 +6167,37 @@ doc/{bash.1,bashref.texi}
- pathname expansion: note that under some circumstances the shell
will invoke the matching engine for words with unquoted backslashes
- posixglob: document the new shell option and its effects

6/27
----
{config.h.in,configure.ac}
- setresuid,setresgid: check and set HAVE_{DECL,}_SETRES[UG]ID as
appropriate

shell.c
- disable_priv_mode: if we have setres[ug]id, use them over
set[ug]id, which only set the save user-id and group-id if the
process is running as root. From Ian Eldred Pudney
in https://savannah.gnu.org/patch/?9822

6/28
----
lib/glob/glob.c
- glob_vector: don't bother trying to read the directory if the filename
pattern doesn't have any globbing characters except backslash; just
dequote the pattern and try to lstat(2) it as if there were no
globbing characters at all. From an austingroup-bugs discussion
message from Stephane Chazelas <stephane.chazelas@gmail.com>

bashline.c
- completion_glob_pattern: just call glob_pattern_p and make sure it
returns 1 (non-backslash globbing characters)

builtins/help.def
- help_builtin: don't try pattern matching the help topic argument
unless glob_pattern_p returns 1

pathexp.c
- unquoted_glob_pattern_p: when in a bracket expression (open > 0),
don't allow an unquoted slash as part of the bracket expression.
Report from Stephane Chazelas <stephane.chazelas@gmail.com>
2 changes: 2 additions & 0 deletions MANIFEST
Original file line number Diff line number Diff line change
Expand Up @@ -1100,6 +1100,8 @@ tests/glob2.sub f
tests/glob3.sub f
tests/glob4.sub f
tests/glob5.sub f
tests/glob6.sub f
tests/glob7.sub f
tests/glob.right f
tests/globstar.tests f
tests/globstar.right f
Expand Down
50 changes: 1 addition & 49 deletions bashline.c
Original file line number Diff line number Diff line change
Expand Up @@ -3846,55 +3846,7 @@ static int
completion_glob_pattern (string)
char *string;
{
register int c;
char *send;
int open;

DECLARE_MBSTATE;

open = 0;
send = string + strlen (string);

while (c = *string++)
{
switch (c)
{
case '?':
case '*':
return (1);

case '[':
open++;
continue;

case ']':
if (open)
return (1);
continue;

case '+':
case '@':
case '!':
if (*string == '(') /*)*/
return (1);
continue;

case '\\':
if (*string++ == 0)
return (0);
}

/* Advance one fewer byte than an entire multibyte character to
account for the auto-increment in the loop above. */
#ifdef HANDLE_MULTIBYTE
string--;
ADVANCE_CHAR_P (string, send - string);
string++;
#else
ADVANCE_CHAR_P (string, send - string);
#endif
}
return (0);
return (glob_pattern_p (string) == 1);
}

static char *globtext;
Expand Down
2 changes: 1 addition & 1 deletion builtins/help.def
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ help_builtin (list)

/* We should consider making `help bash' do something. */

if (glob_pattern_p (list->word->word))
if (glob_pattern_p (list->word->word) == 1)
{
printf ("%s", ngettext ("Shell commands matching keyword `", "Shell commands matching keywords `", (list->next ? 2 : 1)));
print_word_list (list, ", ");
Expand Down
10 changes: 9 additions & 1 deletion config.h.in
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/* config.h -- Configuration file for bash. */

/* Copyright (C) 1987-2009,2011-2012 Free Software Foundation, Inc.
/* Copyright (C) 1987-2009,2011-2012,2013-2019 Free Software Foundation, Inc.

This file is part of GNU Bash, the Bourne Again SHell.

Expand Down Expand Up @@ -813,6 +813,14 @@
#undef HAVE_SETREGID
#undef HAVE_DECL_SETREGID

/* Define if you have the setregid function. */
#undef HAVE_SETRESGID
#undef HAVE_DECL_SETRESGID

/* Define if you have the setresuid function. */
#undef HAVE_SETRESUID
#undef HAVE_DECL_SETRESUID

/* Define if you have the setvbuf function. */
#undef HAVE_SETVBUF

Expand Down
13 changes: 12 additions & 1 deletion configure
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#! /bin/sh
# From configure.ac for Bash 5.0, version 5.010.
# From configure.ac for Bash 5.0, version 5.011.
# Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.69 for bash 5.0-maint.
#
Expand Down Expand Up @@ -14239,6 +14239,17 @@ cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_SETREGID $ac_have_decl
_ACEOF

ac_fn_c_check_decl "$LINENO" "" "ac_cv_have_decl_" "$ac_includes_default"
if test "x$ac_cv_have_decl_" = xyes; then :
ac_have_decl=1
else
ac_have_decl=0
fi

cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_ $ac_have_decl
_ACEOF
(setresuid, setresgid)
ac_fn_c_check_decl "$LINENO" "strcpy" "ac_cv_have_decl_strcpy" "$ac_includes_default"
if test "x$ac_cv_have_decl_strcpy" = xyes; then :
ac_have_decl=1
Expand Down
3 changes: 2 additions & 1 deletion configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -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.0, version 5.010])dnl
AC_REVISION([for Bash 5.0, version 5.011])dnl

define(bashvers, 5.0)
define(relstatus, maint)
Expand Down Expand Up @@ -850,6 +850,7 @@ AC_CHECK_DECLS([confstr])
AC_CHECK_DECLS([printf])
AC_CHECK_DECLS([sbrk])
AC_CHECK_DECLS([setregid])
AC_CHECK_DECLS[(setresuid, setresgid])
AC_CHECK_DECLS([strcpy])
AC_CHECK_DECLS([strsignal])

Expand Down
3 changes: 2 additions & 1 deletion doc/bash.1
Original file line number Diff line number Diff line change
Expand Up @@ -4702,7 +4702,8 @@ above).
.PD
.SH "SIMPLE COMMAND EXPANSION"
When a simple command is executed, the shell performs the following
expansions, assignments, and redirections, from left to right.
expansions, assignments, and redirections, from left to right, in
the following order.
.IP 1.
The words that the parser has marked as variable assignments (those
preceding the command name) and redirections are saved for later
Expand Down
3 changes: 2 additions & 1 deletion doc/bashref.texi
Original file line number Diff line number Diff line change
Expand Up @@ -2968,7 +2968,8 @@ is not specified. If the file does not exist, it is created.
@cindex command expansion

When a simple command is executed, the shell performs the following
expansions, assignments, and redirections, from left to right.
expansions, assignments, and redirections, from left to right, in
the following order.

@enumerate
@item
Expand Down
5 changes: 4 additions & 1 deletion lib/glob/glob.c
Original file line number Diff line number Diff line change
Expand Up @@ -634,6 +634,7 @@ glob_vector (pat, dir, flags)
register unsigned int i;
int mflags; /* Flags passed to strmatch (). */
int pflags; /* flags passed to sh_makepath () */
int hasglob; /* return value from glob_pattern_p */
int nalloca;
struct globval *firstmalloc, *tmplink;
char *convfn;
Expand Down Expand Up @@ -675,10 +676,12 @@ glob_vector (pat, dir, flags)
patlen = (pat && *pat) ? strlen (pat) : 0;

/* If the filename pattern (PAT) does not contain any globbing characters,
or contains a pattern with only backslash escapes (hasglob == 2),
we can dispense with reading the directory, and just see if there is
a filename `DIR/PAT'. If there is, and we can access it, just make the
vector to return and bail immediately. */
if (skip == 0 && glob_pattern_p (pat) == 0)
hasglob = 0;
if (skip == 0 && (hasglob = glob_pattern_p (pat)) == 0 || hasglob == 2)
{
int dirlen;
struct stat finfo;
Expand Down
16 changes: 14 additions & 2 deletions pathexp.c
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,10 @@ int glob_star = 0;
/* Do we handle backslashes in patterns the way Posix specifies? */
int posix_glob_backslash = 1;

/* Return nonzero if STRING has any unquoted special globbing chars in it. */
/* Return nonzero if STRING has any unquoted special globbing chars in it.
This is supposed to be called when pathname expansion is performed, so
it implements the rules in Posix 2.13.3, specifically that an unquoted
slash cannot appear in a bracket expression. */
int
unquoted_glob_pattern_p (string)
register char *string;
Expand All @@ -88,10 +91,14 @@ unquoted_glob_pattern_p (string)
continue;

case ']':
if (open)
if (open) /* XXX - if --open == 0? */
return (1);
continue;

case '/':
if (open)
open = 0;

case '+':
case '@':
case '!':
Expand All @@ -109,6 +116,11 @@ unquoted_glob_pattern_p (string)
string++;
continue;
}
else if (open && *string == '/')
{
string++; /* quoted slashes in bracket expressions are ok */
continue;
}
else if (*string == 0)
return (0);

Expand Down
8 changes: 8 additions & 0 deletions shell.c
Original file line number Diff line number Diff line change
Expand Up @@ -1293,7 +1293,11 @@ disable_priv_mode ()
{
int e;

#if HAVE_DECL_SETRESUID
if (setresuid (current_user.uid, current_user.uid, current_user.uid) < 0)
#else
if (setuid (current_user.uid) < 0)
#endif
{
e = errno;
sys_error (_("cannot set uid to %d: effective uid %d"), current_user.uid, current_user.euid);
Expand All @@ -1302,7 +1306,11 @@ disable_priv_mode ()
exit (e);
#endif
}
#if HAVE_DECL_SETRESGID
if (setresgid (current_user.gid, current_user.gid, current_user.gid) < 0)
#else
if (setgid (current_user.gid) < 0)
#endif
sys_error (_("cannot set gid to %d: effective gid %d"), current_user.gid, current_user.egid);

current_user.euid = current_user.uid;
Expand Down
2 changes: 2 additions & 0 deletions tests/glob.tests
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ ${THIS_SH} ./glob2.sub
${THIS_SH} ./glob3.sub
${THIS_SH} ./glob4.sub
${THIS_SH} ./glob5.sub
${THIS_SH} ./glob6.sub
${THIS_SH} ./glob7.sub

MYDIR=$PWD # save where we are

Expand Down
54 changes: 54 additions & 0 deletions tests/glob6.sub
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
# tests of the backslash-in-glob-patterns discussion on the austin-group ML

: ${TMPDIR:=/var/tmp}

ORIG=$PWD
GLOBDIR=$TMPDIR/bash-glob-$$
mkdir $GLOBDIR && cd $GLOBDIR

# does the pattern matcher allow backslashes as escape characters and remove
# them as part of matching?
touch abcdefg
pat='ab\cd*'
printf '<%s>\n' $pat
pat='\.'
printf '<%s>\n' $pat
rm abcdefg

# how about when escaping pattern characters?
touch '*abc.c'
a='\**.c'
printf '%s\n' $a
rm -f '*abc.c'

# how about when making the distinction between readable and searchable path
# components?
mkdir -m a=x searchable
mkdir -m a=r readable

p='searchable/\.'
printf "%s\n" $p

p='searchable/\./.'
printf "%s\n" $p

p='readable/\.'
printf "%s\n" $p

p='readable/\./.'
printf "%s\n" $p

printf "%s\n" 'searchable/\.'
printf "%s\n" 'readable/\.'

echo */.

p='*/\.'
echo $p

echo */'.'

rmdir searchable readable

cd $ORIG
rmdir $GLOBDIR
11 changes: 11 additions & 0 deletions tests/glob7.sub
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# according to Posix 2.13.3, a slash in a bracket expression renders that
# bracket expression invalid
shopt -s nullglob

echo 1: [qwe/qwe]
echo 2: [qwe/
echo 3: [qwe/]

echo 4: [qwe\/qwe]
echo 5: [qwe\/
echo 6: [qwe\/]

0 comments on commit 951bdaa

Please sign in to comment.