gww@marduk.UUCP (Gary Winiger) (09/05/87)
Subject: Getopt(3) does not return '?' when opterr == 0 and an illegal option is encountered +Fix Index: libc/compat-sys5/getopt.c 4.3BSD +Fix Description: Getopt(3) should return '?' when either an illegal option or an option requiring an argument without on is encountered. Instead, it gets a segmentation violation on systems which do not permit dereferencing of null pointers. Repeat-By: Write a program which sets opterr to zero (0). Call that program with an illegal option. Fix: The marco ``tell'' should always cause ``return(BADCH)'' to be executed, regardless of printing a diagnostic message. The attached code solves this problem at Elxsi. Gary.. {ucbvax!sun,lll-lcc!lll-tis,amdahl!altos86,bridge2}!elxsi!gww --------- cut --------- snip --------- :.,$w diff ------------- *** /tmp/,RCSt1000299 Fri Jun 26 11:05:41 1987 --- getopt.c Fri Jun 26 11:05:26 1987 *************** *** 1,5 **** --- 1,9 ---- /* * $Log: getopt.c,v $ + * Revision 1.2 87/06/26 11:04:53 gww + * Return '?' when opterr == 0 and illegal option, or option requires an + * argument is encountered. + * * Revision 1.1 87/01/07 18:25:01 gww * Initial revision * *************** *** 11,17 **** */ #if defined(LIBC_SCCS) && !defined(lint) ! static char *ERcsId = "$Header: getopt.c,v 1.1 87/01/07 18:25:01 gww Exp $ ENIX BSD"; static char sccsid[] = "@(#)getopt.c 4.3 (Berkeley) 3/9/86"; #endif LIBC_SCCS and not lint --- 15,21 ---- */ #if defined(LIBC_SCCS) && !defined(lint) ! static char *ERcsId = "$Header: getopt.c,v 1.2 87/06/26 11:04:53 gww Exp $ ENIX BSD"; static char sccsid[] = "@(#)getopt.c 4.3 (Berkeley) 3/9/86"; #endif LIBC_SCCS and not lint *************** *** 27,34 **** #define BADCH (int)'?' #define EMSG "" ! #define tell(s) if (opterr) {fputs(*nargv,stderr);fputs(s,stderr); \ ! fputc(optopt,stderr);fputc('\n',stderr);return(BADCH);} getopt(nargc,nargv,ostr) int nargc; --- 31,38 ---- #define BADCH (int)'?' #define EMSG "" ! #define tell(s) {if (opterr) {fputs(*nargv,stderr);fputs(s,stderr); \ ! fputc(optopt,stderr);fputc('\n',stderr);}return(BADCH);} getopt(nargc,nargv,ostr) int nargc;