Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date: Fri, 21 Jun 2013 11:52:26 -0400
From: Rich Felker <>
Subject: Re: Fix for tcsh

On Fri, Jun 21, 2013 at 11:19:01AM +0200, Paul Schutte wrote:
> Good day,
> I just want to know what would be right approach to fixing the compile
> error in tcsh.
> I use the source code at
> I get the following error:
> gcc -c -g -O2 -I. -I. -D_PATH_TCSHELL='"/usr/local/bin/tcsh"'    sh.proc.c
> sh.proc.c: In function 'pchild':
> sh.proc.c:155:16: error: storage size of 'w' isn't known
> make: *** [sh.proc.o] Error 1
> Those lines are:
> #ifdef BSDWAIT
>     union wait w;
> #else /* !BSDWAIT */
>     int     w;
> #endif /* !BSDWAIT */
> If I just use
> //#ifdef BSDWAIT
> //    union wait w;
> //#else /* !BSDWAIT */
>     int     w;
> //#endif /* !BSDWAIT */
> it compiles and works (for months now without an issue).
> My question really is what should the proper "ifdef" be if I want to send
> the fix to the tcsh maintainers ?

Where is BSDWAIT defined? That's the location of the relevant ifdef.
Using "union wait" on any Linux system, glibc ones included, is wrong;
glibc just included gcc-specific hacks in the declaration of wait and
waitpid to allow them to accept "union wait *" instead of "int *" if
necessary. I suspect defined(__linux__) leads to #define BSDWAIT, in
which case this should just be fixed.

With that said, using "union wait" at all is nonsensical. As the
standards require the argument to be int *, any modern BSD should work
fine with int *. In case there are historical ones that prototype
the functions with union wait *, it might work to simply declare "w"
as int and cast it to (void *) when passing it to the functions.


Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.