On Thu, Aug 4, 2016 at 2:36 PM, Chet Ramey <chet.ra...@case.edu> wrote:
> On 8/4/16 12:05 PM, Dan Cross wrote:
> > Bash Version: 4.3
> > Patch Level: 30
> > Release Status: release
> >
> > Description:
> >         When bash is built without job control, shell scripts that use
> >         the 'test' builtin (e.g., via '[') in conditionals may take the
> >         wrong branch becuase the exit status of the test is lost.
> >
> > Repeat-By:
> >         Configure without job control.  Via e.g.,
> >         ./configure --prefix=/usr --bindir=/bin --without-bash-malloc
> --disable-nls --disable-job-control
> >         Invoke the resulting shell and run the following sequence of
> commands:
> >
> >         $ cat > foo.sh
> >         if [ $# -lt 2 ]
> >         then
> >                 echo "$# args is less than 2"
> >         else
> >                 echo "$# args is not less than 2"
> >         fi
> >         $ chmod +x ./foo.sh
> >         $ ./foo.sh 1 2 3 4
> >         4 args is less than 2
> >         $
> >
> >         Observe the output: '4' is not actually less than '2' yet the
> >         script incorrectly reports it as such.
>
> Thanks for the report.  I took a quick look at this, and it's not disabling
> job control that does it: it's disabling both job control and nls.
> Disabling either one while leaving the other enabled doesn't produce this
> error (which only happens in the case where you run a script with the
> execute bit set without a #! line after running an executable that causes
> the shell to call waitpid()).  It's a strange set of circumstances.
> I'll see what I can find.
>

Thanks, Chet. FYI, I tried building for the research kernel with NLS
enabled and am still seeing the problem. Our patch is pretty minimal
(mostly just adding the name of the OS as supported in the various
configure scripts, and we have a requirement that strings written using
'echo' get written with one system call, so I bypass stdio for that. Oh,
and we have another context string in addition to errno that we print on
errors). Also, I was able to reproduce on an unpatched bash on Linux with
NLS enabled:

% ../configure --prefix=/usr --bindir=/bin --without-bash-malloc
--disable-job-control
% grep NLS config.h
#define ENABLE_NLS 1
% make
(build output omitted for brevity)
% ./bash --noprofile --norc
$ ./foo.sh 1 2 3 4
4 args is not less than 2
$ ./foo.sh 1 2 3 4
4 args is less than 2
$ exit
%

Thanks again!

        - Dan C.

(PS: If you're curious, we're porting bash to the Akaros operating system:
http://akaros.org/)

Reply via email to