From: osirisgot...@hotmail.com
To: bug-bash@gnu.org,b...@packages.debian.org
Subject: compat42 and compat41 behave incorrectly, compat41 not possible at all

compat42 and compat41 shell options are set incorrectly when set via BASH_COMPAT


Configuration Information [Automatically generated, do not change]:
Machine: x86_64
OS: linux-gnu
Compiler: gcc
Compilation CFLAGS: -DPROGRAM='bash' -DCONF_HOSTTYPE='x86_64' -DCONF_OSTYPE='linux-gnu' -DCONF_MACHTYPE='x86_64-pc-linux-gnu' -DCONF_VENDOR='pc' -DLOCALEDIR='/usr/share/locale' -DPACKAGE='bash' -DSHELL -DHAVE_CONFIG_H -I. -I../. -I.././include -I.././lib -D_FORTIFY_SOURCE=2 -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wall uname output: Linux larnica 4.2.0-22-generic #27-Ubuntu SMP Thu Dec 17 22:57:08 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
Machine Type: x86_64-pc-linux-gnu

Bash Version: 4.3
Patch Level: 42
Release Status: release

Description:
when setting BASH_COMPAT to the documented values of '4.2', '42', '4.1', and '41' the shell responds incorrectly by setting the incorrect shell option, see the repeat-by for a table to clearly see what is going on. Please note problematic values are listed along with a SINGLE working value for contrast purposes, the other unlisted values work as expected.


Repeat-By:
    TABLE 1 - BASH_COMPAT <-> shell options (shopt) relationships


BASH_COMPAT     shopt result
        expected shopt  error?  notes

3.1     compat31        compat31        NO
31      compat31        compat31        NO
3.2     compat32        compat32        NO
32      compat32        compat32        NO
40      compat40        compat40        NO
4.0     compat40        compat40        NO
4.2     NONE    compat42        YES
42      NONE    compat42        YES
4.1     compat41,       compat41        YES     (1/2**)
41      compat41,       compat41        YES     (1/2**)
<unset or "">
        NONE    NONE    NO



* all values are set EXACTLY as shown unless between arrowed brackets <>
    ** when two options get set, one is correct, the other is not because
           more than one would contradict it's purpose.

1) start a bash shell with 'bash --norc' to ensure no/minimal outside influences
    2) type 'BASH_COMPAT=<value>; shopt | grep compat' where the
       <value> is one of the entries from the above table
3) press ENTER to set and observe the effects of the variable being sete

Fix:
Not too sure but I can guess as a programmer that there is some kind of fence post error OR bit-logic error. I dont have time to go through the source myself, so I hope this is enough info. No coredump because no crash actually results from this.

PS: Not sure if this is intended or not, but when errexit is set, and an invalid BASH_COMPAT value is assigned; the error message is displayed, but $? is unchanged as if no error was observed, and as a result, errexit does not cause an exit. I was in a position where I needed this to happen, and it seemed that because of that, it is a little pointless to even have BASH_COMPAT if the error doesn't even communicate to the script's environment in any way (except 'catching' output, which
    may more may not work if redirections are in effect).

Sorry if this was not a bug or problem and I had missed some documentation -- please let me know where it is
    so this documentation may become more informative (info or man).



    [Description of how to fix the problem.  If you don't know a
    fix for the problem, don't include this section.]

Reply via email to