Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: Bug Report: Env Vars and shell functions



> I get a segfault with the following
> 
> sun4% zsh -c xyzzy 
> hello
> zsh: 18399 segmentation fault  zsh -c xyzzy
> 
> where xyzzy is an autoloaded function containing
> 
> #!/usr/local/bin/zsh
> . thing
> 
> and `thing' is a file reading
> 
> echo hello
> 
> Traceback attached.  None of the alloc_stackp related patches applied, since
> they seemed all to be cosmetic.

They were not really cosmetic.  Had you applied these you would not have
received this.  These SEGV's are all caused by DPUTS, since it seems that
you did not applied the patch which replaces X to Y in DPUTS in zsh.h line
1314.  That was a silly typo I made before pre2 which means zsh crashes
every time when DPUTS wants to print something (which makes it look much
more serious).

> On a related note, should the following not restore IFS?
> 
> sun4% IFS=@ set a@b@c@d; echo $IFS 
> @

Here is what POSIX says:

     (2)  Variable assignments specified with special built-in utilities
          shall remain in effect after the built-in completes; this shall
          not be the case with a regular built-in or other utility.

And POSIX special builtins are

              .          continue   exit       return     trap
              :          eval       export     set        unset
              break      exec       readonly   shift

And it also says that shell functions should be handled similarily to
special builtins (which means that recent patches from Peter and me make
zsh less conformant).

Zsh currently treats a builtin this way only if the BINF_MAGICEQUALS flag
is set for the builtin.  These builtins are: alias, declare, hash, integer,
local, readonly and typeset.

Of course zsh does not conforms to the POSIX rule and handling of special
parameters in undoubtadly not the best but it also means that applications
should not expect local variable assignments before special builtins since
it may change in the future.

Also note that command arguments are evaluated before variable assignments
so the above example will never work.  The other problem with that example
is that field splitting is only done on the result of expansions so the
explicitely given a@b@c@d is not split even if IFS is set correctly before
set.

In a POSIX shell the command builtin can be used to execute special
builtins (in zsh it executes external command only).  Note that command in
not listed among the special builtins above which means that the special
assignment behaviour can be prevented by prefixing a special builtin with
the command builtin (I'm talking about POSIX and not about zsh).

I'm writing these because these differences between zsh and POSIX are
probably the most important ones.  Other than that zsh is now mostly POSIX
conformant (POSIX does not allow the MAGICEQUALS behaviour of the typeset
family but all other shells (bash, ksh93 and pdksh) do that unles
POSIXLY_CORRECT is defined).

> Ah. Another core dump:
> sun4% $(grep[TAB][TAB]
> Program received signal SIGSEGV, Segmentation fault.
> 0x6ff8128c in _doprnt ()
> #2  0x9afd0 in doexpandhist () at zle_tricky.c:3817
> 3817        DPUTS(useheap, "BUG: useheap in doexpandhist()");

That is already fixed some time ago.  It was a misplaced goto label.

Zoltan




Messages sorted by: Reverse Date, Date, Thread, Author