Thread View: gnu.bash.bug
3 messages
3 total messages
Started by Richard Goerwitz
Fri, 09 Feb 1990 18:37
question about nojobs.c, bash-1.04
Author: Richard Goerwitz
Date: Fri, 09 Feb 1990 18:37
Date: Fri, 09 Feb 1990 18:37
54 lines
1968 bytes
1968 bytes
Silly question?
/* from jobs.h */
union wait {
struct { /* clever way of getting at
unsigned char low; * wait's high and low
unsigned char high; * status bytes
} * /
bytes;
short word;
};
#define WSTOPPED 0177
#define w_status word
#define w_termsig bytes.low & 0x7f /* mask out eighth bit */
#define w_stopsig bytes.high
#define w_retcode bytes.high
/* from nojobs.c, line 163 and following: */
while ((got_pid = wait (&status)) != pid)
{
if (got_pid < 0 && errno == ECHILD)
{
status.w_termsig = status.w_retcode = 0; /* <-- NOTE */
break;
}
else if (got_pid < 0 && errno != EINTR)
programming_error ("got errno %d while waiting for %d", errno, pid);
}
The hitch here is that w_termsig expands to bytes.low & 0x7f. Hence the
entire expression expands to
status.bytes.low & 0x7f = status.w_retcode = 0;
What is the intention here? I'm just curious. If the attempt is being
made to zero out the lower seven bits of status.bytes.low, wouldn't
status.bytes.low &= 0x80;
be more appropriate?
I don't claim to be a wizard. I'm just trying to compile Bash on my
Xenix box.
If this is a silly question, and I should have seen what was going on
I'd still like to know about my mistake.
-Richard L. Goerwitz goer%sophist@uchicago.bitnet
goer@sophist.uchicago.edu rutgers!oddjob!gide!sophist!goer
question about nojobs.c, bash-1.04
Author: Brian Fox
Date: Fri, 09 Feb 1990 20:03
Date: Fri, 09 Feb 1990 20:03
67 lines
2443 bytes
2443 bytes
Date: 9 Feb 90 18:37:47 GMT
From: asuvax!ncar!tank!sophist!goer@cs.utexas.edu (Richard Goerwitz)
Organization: University of Chicago
Sender: bug-bash-request@prep.ai.mit.edu
Silly question?
No.
What is the intention here? I'm just curious. If the attempt is being
made to zero out the lower seven bits of status.bytes.low, wouldn't
status.bytes.low &= 0x80;
be more appropriate?
I don't claim to be a wizard. I'm just trying to compile Bash on my
Xenix box.
If this is a silly question, and I should have seen what was going on
I'd still like to know about my mistake.
You (among others) found this bug in Bash. The problem was a poor
description for the structure returned by wait () on little-endian
machines. We have since fixed the description, and here it is:
#ifdef NO_WAIT_H
#ifdef LITTLE_ENDIAN
union wait
{
int w_status; /* used in syscall */
/* Terminated process status. */
struct
{
unsigned short
w_Termsig : 7, /* termination signal */
w_Coredump : 1, /* core dump indicator */
w_Retcode : 8, /* exit code if w_termsig==0 */
w_Fill1 : 16; /* high 16 bits unused */
} w_T;
/* Stopped process status. Returned
only for traced children unless requested
with the WUNTRACED option bit. */
struct
{
unsigned short
w_Stopval : 8, /* == W_STOPPED if stopped */
w_Stopsig : 8, /* actually zero on XENIX */
w_Fill2 : 16; /* high 16 bits unused */
} w_S;
};
#endif /* LITTLE_ENDIAN */
#define w_termsig w_T.w_Termsig
#define w_coredump w_T.w_Coredump
#define w_retcode w_T.w_Retcode
#define w_stopval w_S.w_Stopval
#define w_stopsig w_S.w_Stopsig
#define WSTOPPED 0177
#define WIFSTOPPED(x) (((x) . w_stopval) == WSTOPPED)
#define WIFEXITED(x) ((! (WIFSTOPPED (x))) && (((x) . w_termsig) == 0))
#define WIFSIGNALED(x) ((! (WIFSTOPPED (x))) && (((x) . w_termsig) != 0))
#endif /* NO_WAIT_H */
Re: question about nojobs.c, bash-1.04
Author: Bjorn Engsig
Date: Tue, 13 Feb 1990 13:18
Date: Tue, 13 Feb 1990 13:18
18 lines
1360 bytes
1360 bytes
Article <7551@tank.uchicago.edu> by goer@sophist.UUCP (Richard Goerwitz) says:
| struct { /* clever way of getting at
| unsigned char low; * wait's high and low
| } * /
| bytes;
|#define w_termsig bytes.low & 0x7f /* mask out eighth bit */
| status.w_termsig = status.w_retcode = 0; /* <-- NOTE */
|
|[...] w_termsig expands to bytes.low & 0x7f [and the] expression expands to
|
| status.bytes.low & 0x7f = status.w_retcode = 0;
In many systsem, a system header file will define the struct with bitfields
named termsig, etc. but the bash implementors define these as masks to help
those without the right header file. They then just this incorrectly, and you
should use the masking status.bytes.low &= 0x80 as you suggest.
--
Bjorn Engsig, Domain: bengsig@oracle.nl, bengsig@oracle.com
Path: uunet!{mcsun!orcenl,oracle}!bengsig
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads