Date: Sat, 26 Jan 2002 09:40:06 -0800 (PST) From: Giorgos Keramidas <keramida@freebsd.org> To: freebsd-bugs@FreeBSD.org Subject: Re: misc/34270: man -k could be used to execute any command. Message-ID: <200201261740.g0QHe6i07522@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR misc/34270; it has been noted by GNATS. From: Giorgos Keramidas <keramida@freebsd.org> To: "Crist J. Clark" <cjc@freebsd.org> Cc: bug-followup@freebsd.org Subject: Re: misc/34270: man -k could be used to execute any command. Date: Sat, 26 Jan 2002 19:23:40 +0200 Here's a partial fix for the "apropos" and "whatis" options of man(1). This leaves still 4 places where man/man.c uses do_system_command(), since I need to understand the code before I make any changes. The code of man.c is still vulnerable to environment variable tricks, but at least it works with -f and -k options without problems: My current /usr/bin/man executable: $ man -k 'firewalls"; echo --- hi giorgos! ---; "' firewall(7) - simple firewalls under FreeBSD --- hi giorgos! --- : permission denied execution of the shell failed in function system() The patched man.c version works correctly: $ ./man -k 'firewalls"; echo --- hi giorgos! ---; "' firewalls"; echo --- hi giorgos! ---; ": nothing appropriate Here's the diff... --- patch begins here --- Index: man/man.c =================================================================== RCS file: /home/ncvs/src/gnu/usr.bin/man/man/man.c,v retrieving revision 1.53 diff -2 -u -r1.53 man.c --- man/man.c 22 Jan 2002 15:15:38 -0000 1.53 +++ man/man.c 26 Jan 2002 17:02:15 -0000 @@ -19,4 +19,6 @@ #define MAN_MAIN +#include <sys/types.h> +#include <sys/wait.h> #include <sys/file.h> #include <sys/stat.h> @@ -526,17 +528,16 @@ register char *name; { - register int len; - register char *command; - - len = strlen (APROPOS) + strlen (name) + 4; - - if ((command = (char *) malloc(len)) == NULL) - gripe_alloc (len, "command"); - - sprintf (command, "%s \"%s\"", APROPOS, name); - - (void) do_system_command (command); + pid_t pid; + int status; - free (command); + if ((pid = fork()) < 0) { + return; + } else if (pid > 0) { + waitpid(pid, &status, 0); + } else { + /* Run the "apropos" command. */ + execlp(APROPOS, APROPOS, name, (char *) NULL); + exit(1); + } } @@ -548,17 +549,16 @@ register char *name; { - register int len; - register char *command; - - len = strlen (WHATIS) + strlen (name) + 4; - - if ((command = (char *) malloc(len)) == NULL) - gripe_alloc (len, "command"); - - sprintf (command, "%s \"%s\"", WHATIS, name); - - (void) do_system_command (command); + pid_t pid; + int status; - free (command); + if ((pid = fork()) < 0) { + return; + } else if (pid > 0) { + waitpid(pid, &status, 0); + } else { + /* Run the "whatis" command. */ + execlp(WHATIS, WHATIS, name, (char *) NULL); + exit(1); + } } --- patch ends here --- To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200201261740.g0QHe6i07522>