Path: utzoo!utgpu!jarvis.csri.toronto.edu!mailrus!tut.cis.ohio-state.edu!UCSD.EDU!emil%chem From: emil%chem@UCSD.EDU (Emil M. Scoffone) Newsgroups: gnu.bash.bug Subject: bash bug report Message-ID: <8907212214.AA19076@sdchemv1.chem.ucsd.edu> Date: 21 Jul 89 22:14:08 GMT Sender: daemon@tut.cis.ohio-state.edu Distribution: gnu Organization: GNUs Not Usenet Lines: 227 To: bug-bash@ai.mit.edu GNU program: Bash 1.02 Machine: Compaq Deskpro 386/16 Operating System: System V/386 Release 3.2 (vendor: Bell Technologies) Compiler: GNU C, version 1.35, with GNU as and ld. **************************************** These are bugs I found while installing bash: ---------------------------------------- in `shell.c': on line 305: 'job_control' undefined. Fix: changed line 304 from #ifndef JOB_CONTROL to #ifndef NOJOBS ---------------------------------------- in `variables.c' and `readline.c': `struct pwd' should be `struct passwd' ---------------------------------------- in `readline.c': `sigsetmask' is referenced, but there is no such system call on my UNIX. Fix: I defined a dummy `sigsetmask' that does nothing. I was too lazy to write one that mimicks the behaviour of BSD `sigsetmask' ---------------------------------------- in 'glob.c': I added an #ifdef to use the GNU builtin alloca. ---------------------------------------- **************************************** These are bugs I found while running bash: ---------------------------------------- The shell does incorrectly reports exit codes from a killed job. This is because a couple of masks were defined incorrectly in `jobs.h'. I also parenthesized two expressions in 'nojobs.h'. ---------------------------------------- I get segmentation violations or memory errors, and the shell bombs, when I hit ^D. This is the same bug I reported a couple of days ago on a Sun 3/160, and I fixed it the same way (added a few lines to 'parse.y'). ---------------------------------------- **************************************** The following is a list of modifications to the source files: ------------------------------------------------------------ diff -c shell.c shell.c~ *** shell.c Tue Jul 11 20:33:11 1989 --- shell.c~ Fri Jul 21 15:01:20 1989 *************** *** 301,307 **** else { interactive = 0; ! #ifndef NOJOBS job_control = 0; #endif } --- 301,307 ---- else { interactive = 0; ! #ifndef JOB_CONTROL job_control = 0; #endif } ------------------------------------------------------------ diff -c variables.c variables.c~ *** variables.c Tue Jul 11 21:02:14 1989 --- variables.c~ Fri Jul 21 15:01:20 1989 *************** *** 26,31 **** --- 26,35 ---- #include "flags.h" #include "version.h" + #ifdef SYSV + struct pwd *getpwuid (), *getpwent (); + #endif + /* The list of shell variables that the user has created, or that came from the environment. */ SHELL_VAR *variable_list; ------------------------------------------------------------ diff -c ./lib/readline.c ./lib/readline.c~ *** ./lib/readline.c Fri Jul 21 15:07:21 1989 --- ./lib/readline.c~ Fri Jul 21 15:02:42 1989 *************** *** 58,63 **** --- 58,66 ---- #include #include + #ifdef SYSV + struct pwd *getpwuid (), *getpwent (); + #endif #define HACK_TERMCAP_MOTION *************** *** 272,284 **** *old_ttou = (Function *)NULL, *old_ttin = (Function *)NULL, *old_cont = (Function *)NULL; - - #ifdef SYSV - void sigsetmask(mask) - int mask; - { - } - #endif SYSV /* Handle an interrupt character. */ static --- 275,280 ---- ------------------------------------------------------------ diff -c jobs.h jobs.h~ *** jobs.h Mon Jul 17 22:14:14 1989 --- jobs.h~ Fri Jul 21 15:01:20 1989 *************** *** 17,26 **** #define WSTOPPED 0177 #define w_status word ! #define w_termsig bytes.low & 0x7f ! #define w_coredump bytes.low & ~0x7f #define w_stopsig bytes.high #define w_retcode bytes.high #define WIFEXITED(wstat) ((wstat).bytes.low == 0) #define WIFSTOPPED(wstat) ((wstat).bytes.low == 0177) #define WIFTERMINATED(wstat) ((wstat).bytes.high == 0) --- 17,26 ---- #define WSTOPPED 0177 #define w_status word ! #define w_termsig bytes.low & ~0x7f #define w_stopsig bytes.high #define w_retcode bytes.high + #define w_coredump w_termsig & 0x7f #define WIFEXITED(wstat) ((wstat).bytes.low == 0) #define WIFSTOPPED(wstat) ((wstat).bytes.low == 0177) #define WIFTERMINATED(wstat) ((wstat).bytes.high == 0) ------------------------------------------------------------ diff -c nojobs.c nojobs.c~ *** nojobs.c Mon Jul 17 22:14:43 1989 --- nojobs.c~ Fri Jul 21 15:11:22 1989 *************** *** 144,151 **** /* Default return value. */ return_val = status.w_retcode & 0x7f; ! if ((status.w_termsig) != 0 && ! (status.w_termsig) != WSTOPPED) { #ifndef SYSV extern char *sys_siglist[]; fprintf (stderr, "%s", sys_siglist[status.w_termsig]); --- 144,151 ---- /* Default return value. */ return_val = status.w_retcode & 0x7f; ! if (status.w_termsig != 0 && ! status.w_termsig != WSTOPPED) { #ifndef SYSV extern char *sys_siglist[]; fprintf (stderr, "%s", sys_siglist[status.w_termsig]); ------------------------------------------------------------ diff -c glob.c glob.c~ *** glob.c Tue Jul 11 21:35:20 1989 --- glob.c~ Fri Jul 21 15:02:19 1989 *************** *** 51,63 **** #ifdef sparc #include #else - - #ifdef __GNUC__ - #define alloca __builtin_alloca - #else extern char *alloca (); - #endif - #endif /* sparc */ extern char *malloc (), *realloc (); --- 51,57 ---- ------------------------------------------------------------ diff -c parse.y parse.y~ *** parse.y Mon Jul 17 22:19:06 1989 --- parse.y~ Fri Jul 21 15:11:03 1989 *************** *** 429,440 **** else current_readline_line = readline (current_readline_prompt); - if (current_readline_line == (char *) EOF) - { - current_readline_line = (char *)NULL; - return (EOF); - } - current_readline_line_index = 0; current_readline_line = (char *)xrealloc (current_readline_line, --- 429,434 ----