BASH PATCH REPORT ================= Bash-Release: 3.2 Patch-ID: bash32-039 Bug-Reported-by: rew@erebor.com Bug-Reference-ID: <20070119065603.546D011E9C@kansas.erebor.com> Bug-Reference-URL: Bug-Description: Bash-3.2 changed the behavior of the [[ command's `=~' operator when the right-hand side was quoted: it matched the quoted portions as strings. This patch introduces a new shell option: compat31. When enabled, it restores the bash-3.1 behavior with respect to evaluating quoted arguments to the =~ operator. Patch: *** ../bash-3.2-patched/execute_cmd.c 2007-12-14 21:12:39.000000000 -0500 --- execute_cmd.c 2008-02-22 21:20:40.000000000 -0500 *************** *** 2547,2551 **** if (arg1 == 0) arg1 = nullstr; ! arg2 = cond_expand_word (cond->right->op, rmatch ? 2 : (patmatch ? 1 : 0)); if (arg2 == 0) arg2 = nullstr; --- 2552,2557 ---- if (arg1 == 0) arg1 = nullstr; ! arg2 = cond_expand_word (cond->right->op, ! (rmatch && shell_compatibility_level > 31) ? 2 : (patmatch ? 1 : 0)); if (arg2 == 0) arg2 = nullstr; *** ../bash-3.2-patched/shell.h 2003-06-01 15:04:36.000000000 -0400 --- shell.h 2008-02-22 21:16:48.000000000 -0500 *************** *** 90,93 **** --- 90,94 ---- extern int interactive, interactive_shell; extern int startup_state; + extern int shell_compatibility_level; /* Structure to pass around that holds a bitmap of file descriptors *** ../bash-3.2-patched/version.c 2007-12-14 21:12:29.000000000 -0500 --- version.c 2008-04-10 08:22:22.000000000 -0400 *************** *** 44,47 **** --- 44,50 ---- const char *sccs_version = SCCSVERSION; + /* If == 31, shell compatible with bash-3.1, == 32 with bash-3.2, and so on */ + int shell_compatibility_level = 32; + /* Functions for getting, setting, and displaying the shell version. */ *** ../bash-3.2-patched/builtins/shopt.def 2005-02-19 17:25:03.000000000 -0500 --- builtins/shopt.def 2008-04-10 08:13:32.000000000 -0400 *************** *** 102,105 **** --- 102,107 ---- static int set_shellopts_after_change __P((int)); + static int set_compatibility_level __P((int)); + #if defined (RESTRICTED_SHELL) static int set_restricted_shell __P((int)); *************** *** 107,110 **** --- 109,113 ---- static int shopt_login_shell; + static int shopt_compat31; typedef int shopt_set_func_t __P((int)); *************** *** 122,125 **** --- 125,129 ---- { "cmdhist", &command_oriented_history, (shopt_set_func_t *)NULL }, #endif + { "compat31", &shopt_compat31, set_compatibility_level }, { "dotglob", &glob_dot_filenames, (shopt_set_func_t *)NULL }, { "execfail", &no_exit_on_failed_exec, (shopt_set_func_t *)NULL }, *************** *** 460,463 **** --- 464,479 ---- } + static int + set_compatibility_level (mode) + int mode; + { + /* Need to change logic here as we add more compatibility levels */ + if (shopt_compat31) + shell_compatibility_level = 31; + else + shell_compatibility_level = 32; + return 0; + } + #if defined (RESTRICTED_SHELL) /* Don't allow the value of restricted_shell to be modified. */ *** ../bash-3.2-patched/doc/bash.1 2006-09-28 10:26:05.000000000 -0400 --- doc/bash.1 2008-04-25 12:32:49.000000000 -0400 *************** *** 7978,7981 **** --- 8200,8209 ---- easy re-editing of multi-line commands. .TP 8 + .B compat31 + If set, + .B bash + changes its behavior to that of version 3.1 with respect to quoted + arguments to the conditional command's =~ operator. + .TP 8 .B dotglob If set, *** ../bash-20080214/doc/bashref.texi 2008-02-08 21:28:35.000000000 -0500 --- doc/bashref.texi 2008-02-22 21:44:51.000000000 -0500 *************** *** 4053,4056 **** --- 4061,4069 ---- easy re-editing of multi-line commands. + @item compat31 + If set, Bash + changes its behavior to that of version 3.1 with respect to quoted + arguments to the conditional command's =~ operator. + @item dotglob If set, Bash includes filenames beginning with a `.' in *** ../bash-3.2-patched/tests/shopt.right 2005-02-19 17:46:09.000000000 -0500 --- tests/shopt.right 2008-04-28 09:13:07.000000000 -0400 *************** *** 7,10 **** --- 7,11 ---- shopt -u checkwinsize shopt -s cmdhist + shopt -u compat31 shopt -u dotglob shopt -u execfail *************** *** 54,57 **** --- 55,59 ---- shopt -u checkhash shopt -u checkwinsize + shopt -u compat31 shopt -u dotglob shopt -u execfail *************** *** 78,81 **** --- 80,84 ---- checkhash off checkwinsize off + compat31 off dotglob off execfail off *** ../bash-3.2/patchlevel.h Thu Apr 13 08:31:04 2006 --- patchlevel.h Mon Oct 16 14:22:54 2006 *************** *** 26,30 **** looks for to find the patch level (for the sccs version string). */ ! #define PATCHLEVEL 38 #endif /* _PATCHLEVEL_H_ */ --- 26,30 ---- looks for to find the patch level (for the sccs version string). */ ! #define PATCHLEVEL 39 #endif /* _PATCHLEVEL_H_ */