Path: csiph.com!xmission!news.snarked.org!news.linkpendium.com!news.linkpendium.com!panix!usenet.stanford.edu!not-for-mail From: Chet Ramey Newsgroups: gnu.bash.bug Subject: Bash-5.0 Official patch 10 Date: Thu, 29 Aug 2019 14:22:23 -0400 Lines: 178 Sender: chet Approved: bug-bash@gnu.org Message-ID: References: <190829182223.AA96985.SM@caleb.ins.cwru.edu> Reply-To: chet.ramey@case.edu NNTP-Posting-Host: lists.gnu.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: usenet.stanford.edu 1567102976 29003 209.51.188.17 (29 Aug 2019 18:22:56 GMT) X-Complaints-To: action@cs.stanford.edu Cc: chet.ramey@case.edu To: bug-bash@gnu.org Envelope-to: bug-bash@gnu.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=case.edu; s=smtp-primary; t=1567102970; bh=axqlyTJXXNZHQQrN4ahuTvf7AnflBHawGZC/Y2F70pk=; h=Date:From:Sender:To:Subject:Cc:Reply-To:Message-ID:MIME-Version: Content-Type; b=HNUj02iaPzJUpx1HfBeizY5qBYszY8hHnPnvzX9sfzHGcfTLarTGfPAqPea26wFzdh BKf9FbdmkZfsiJEp9LRssH62tSmv+XknOSwic0Xhf1RNbsOyjoFIpjciDnqOk1YcvF3 l9YIRraTY0xIZr4zRz+HI5Cuqkuul/hylmbaYZbdrfGJw70nRYLRfc71z+Hw56chpN3 Ptw3QCEg9uk51N5SHQJVwiB2zOrHOrX3oBnxBqtcuBLUoh+AAzIHEOy941p7LBGLYM3 m2DbiT629LXCeBQILaU4IkYUeuaPd/HWJrJV3w7CM3q6rttsPyDxPeVslIp5pyJ6BQT KRJEscfw== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=case.edu; s=smtp-primary; t=1567102967; bh=SRZRzuOx1+BYeYGbEagoIsFoHz+XYjhh1y3OahuVXUw=; h=Date:From:Sender:To:Subject:Cc:Reply-To:Message-ID:MIME-Version: Content-Type; b=Avk91EFnDObpV9/su094joWHFLXNpBF3BV4PLzEP3gEyG+cruHT1UX2YRtjDB5sExF Yi7SMsime9wZwv5mRBsfiMNuf9k2qrto7131rOsQYPaRPo6Q90D7hyadv3EhSp324wa zOSqHDhZlU/V/dn6xzVFX79ema9oPfmqQ/2cqJc8rt7LWuvtw+ffaUl6AjWnzRSIJs9 JDwh5Bbym/5Q1Jl4cUhHi8jfCsoNSd9uX/5e4oMx3w8d9H5WxM0+7YXggfFQvAYmcld ic8qQmlP99JT01q6Uop7s18+Hhh+HqxjnJoI7K6E10vW7mq/aSQQG41xzSG1I/B29iC p/0vtClQ== Read-Receipt-To: chet.ramey@case.edu X-Junkmail-Status: score=7/90, host=mpv2-2015.case.edu X-Junkmail-PrAS-Raw: score=7/90, refid=2.7.2:2019.8.29.175416:17:7.944, ip=, rules=DKIM_SIGNATURE, DATE_TZ_NA, __HAS_FROM, FROM_EDU_TLD, __TO_MALFORMED_2, __TO_NO_NAME, __HAS_CC_HDR, __HAS_REPLYTO, __HAS_MSGID, __SANE_MSGID, __MIME_VERSION, __CT, __CT_TEXT_PLAIN, __REPLYTO_SAMEAS_FROM_ADDY, __REPLYTO_SAMEAS_FROM_ACC, __FROM_DOMAIN_IN_ANY_CC1, __REPLYTO_SAMEAS_FROM_DOMAIN, __DKIM_ALIGNS_1, __DKIM_ALIGNS_2, __ANY_URI, __HTTPS_URI, __URI_WITH_PATH, __URI_NO_WWW, __STOCK_PHRASE_24, __CP_URI_IN_BODY, __SUBJ_ALPHA_NEGATE, __MULTIPLE_URI_TEXT, __URI_IN_BODY, __URI_NOT_IMG, __BODY_NO_MAILTO, BODY_SIZE_6000_6999, __MIME_TEXT_P1, __MIME_TEXT_ONLY, __URI_NS, HTML_00_01, HTML_00_10, DKIM_ALIGNS, __FROM_DOMAIN_IN_RCPT, MULTIPLE_REAL_RCPTS, LEGITIMATE_SIGNS, __MIME_TEXT_P, __PHISH_SPEAR_STRUCTURE_1, REPLYTO_SAMEAS_FROM, BODY_SIZE_7000_LESS, URI_WITH_PATH_ONLY, so=2010-03-03 19:42:08, dmn=2016-08-03-0138 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.4.x-2.6.x [generic] X-Received-From: 129.22.103.227 X-BeenThere: bug-bash@gnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Bug reports for the GNU Bourne Again SHell List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Mailman-Original-Message-ID: <190829182223.AA96985.SM@caleb.ins.cwru.edu> Xref: csiph.com gnu.bash.bug:15333 BASH PATCH REPORT ================= Bash-Release: 5.0 Patch-ID: bash50-010 Bug-Reported-by: Thorsten Glaser Bug-Reference-ID: <156622962831.19438.16374961114836556294.reportbug@tglase.lan.tarent.de> Bug-Reference-URL: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=935115 Bug-Description: Bash-5.0 changed the way assignment statements preceding special builtins and shell functions were handled in posix mode. They automatically created or modified global variables instead of modifying existing local variables as in bash-4.4. The bash-4.4 posix-mode semantics were buggy, and resulted in creating local variables where they were not intended and modifying global variables and local variables simultaneously. The bash-5.0 changes were intended to fix this issue, but did not preserve enough backwards compatibility. The posix standard also changed what it required in these cases, so bash-5.0 is not bound by the strict conformance requirements that existed in previous issues of the standard. This patch modifies the bash-5.0 posix mode behavior in an effort to restore some backwards compatibility and rationalize the behavior in the presence of local variables. It 1. Changes the assignment semantics to be more similar to standalone assignment statements: assignments preceding a function call or special builtin while executing in a shell function will modify the value of a local variable with the same name for the duration of the function's execution; 2. Changes assignments preceding shell function calls or special builtins from within a shell function to no longer create or modify global variables in the presence of a local variable with the same name; 3. Assignment statements preceding a shell function call or special builtin at the global scope continue to modify the (global) calling environment, but are unaffected by assignments preceding function calls or special builtins within a function, as described in item 2. This is also similar to the behavior of a standalone assignment statement. Patch (apply with `patch -p0'): *** ../bash-5.0-patched/variables.c 2018-12-18 11:07:21.000000000 -0500 --- variables.c 2019-08-22 10:53:44.000000000 -0400 *************** *** 4461,4467 **** /* Take a variable from an assignment statement preceding a posix special ! builtin (including `return') and create a global variable from it. This ! is called from merge_temporary_env, which is only called when in posix ! mode. */ static void push_posix_temp_var (data) --- 4461,4467 ---- /* Take a variable from an assignment statement preceding a posix special ! builtin (including `return') and create a variable from it as if a ! standalone assignment statement had been performed. This is called from ! merge_temporary_env, which is only called when in posix mode. */ static void push_posix_temp_var (data) *************** *** 4473,4486 **** var = (SHELL_VAR *)data; ! binding_table = global_variables->table; ! if (binding_table == 0) ! binding_table = global_variables->table = hash_create (VARIABLES_HASH_BUCKETS); ! ! v = bind_variable_internal (var->name, value_cell (var), binding_table, 0, ASS_FORCE|ASS_NOLONGJMP); /* global variables are no longer temporary and don't need propagating. */ ! var->attributes &= ~(att_tempvar|att_propagate); if (v) ! v->attributes |= var->attributes; if (find_special_var (var->name) >= 0) --- 4473,4497 ---- var = (SHELL_VAR *)data; ! /* Just like do_assignment_internal(). This makes assignments preceding ! special builtins act like standalone assignment statements when in ! posix mode, satisfying the posix requirement that this affect the ! "current execution environment." */ ! v = bind_variable (var->name, value_cell (var), ASS_FORCE|ASS_NOLONGJMP); ! ! /* If this modifies an existing local variable, v->context will be non-zero. ! If it comes back with v->context == 0, we bound at the global context. ! Set binding_table appropriately. It doesn't matter whether it's correct ! if the variable is local, only that it's not global_variables->table */ ! binding_table = v->context ? shell_variables->table : global_variables->table; /* global variables are no longer temporary and don't need propagating. */ ! if (binding_table == global_variables->table) ! var->attributes &= ~(att_tempvar|att_propagate); ! if (v) ! { ! v->attributes |= var->attributes; ! v->attributes &= ~att_tempvar; /* not a temp var now */ ! } if (find_special_var (var->name) >= 0) *************** *** 4576,4587 **** { int i; tempvar_list = strvec_create (HASH_ENTRIES (temporary_env) + 1); tempvar_list[tvlist_ind = 0] = 0; ! ! hash_flush (temporary_env, pushf); ! hash_dispose (temporary_env); temporary_env = (HASH_TABLE *)NULL; tempvar_list[tvlist_ind] = 0; --- 4587,4601 ---- { int i; + HASH_TABLE *disposer; tempvar_list = strvec_create (HASH_ENTRIES (temporary_env) + 1); tempvar_list[tvlist_ind = 0] = 0; ! ! disposer = temporary_env; temporary_env = (HASH_TABLE *)NULL; + hash_flush (disposer, pushf); + hash_dispose (disposer); + tempvar_list[tvlist_ind] = 0; *** ../bash-5.0-patched/tests/varenv.right 2018-12-17 15:39:48.000000000 -0500 --- tests/varenv.right 2019-08-22 16:05:25.000000000 -0400 *************** *** 147,153 **** outside: declare -- var="one" inside: declare -x var="value" ! outside: declare -x var="value" ! inside: declare -- var="local" ! outside: declare -x var="global" foo= environment foo= foo=foo environment foo=foo --- 147,153 ---- outside: declare -- var="one" inside: declare -x var="value" ! outside: declare -- var="outside" ! inside: declare -x var="global" ! outside: declare -- var="outside" foo= environment foo= foo=foo environment foo=foo *** ../bash-5.0/patchlevel.h 2016-06-22 14:51:03.000000000 -0400 --- patchlevel.h 2016-10-01 11:01:28.000000000 -0400 *************** *** 26,30 **** looks for to find the patch level (for the sccs version string). */ ! #define PATCHLEVEL 9 #endif /* _PATCHLEVEL_H_ */ --- 26,30 ---- looks for to find the patch level (for the sccs version string). */ ! #define PATCHLEVEL 10 #endif /* _PATCHLEVEL_H_ */ -- ``The lyf so short, the craft so long to lerne.'' - Chaucer ``Ars longa, vita brevis'' - Hippocrates Chet Ramey, UTech, CWRU chet@case.edu http://tiswww.cwru.edu/~chet/