diff options
author | 1996-06-06 12:10:01 +0000 | |
---|---|---|
committer | 1996-06-06 12:10:01 +0000 | |
commit | 1bfae893c4e1654744b56dba824a14ee45be9543 (patch) | |
tree | bf3ad7767dfcdff4e1c039a8b97648e46158e878 | |
parent | use system, so that $EDITOR expansion works (diff) | |
download | wireguard-openbsd-1bfae893c4e1654744b56dba824a14ee45be9543.tar.xz wireguard-openbsd-1bfae893c4e1654744b56dba824a14ee45be9543.zip |
system() $EDITOR safely
-rw-r--r-- | lib/libutil/passwd.c | 12 | ||||
-rw-r--r-- | sbin/disklabel/disklabel.c | 22 | ||||
-rw-r--r-- | usr.sbin/edquota/edquota.c | 20 |
3 files changed, 34 insertions, 20 deletions
diff --git a/lib/libutil/passwd.c b/lib/libutil/passwd.c index c473eca72dc..0d03133d3e3 100644 --- a/lib/libutil/passwd.c +++ b/lib/libutil/passwd.c @@ -154,19 +154,21 @@ pw_edit(notsetuid, filename) filename = _PATH_MASTERPASSWD_LOCK; if (!(editor = getenv("EDITOR"))) editor = _PATH_VI; - if (p = strrchr(editor, '/')) - ++p; - else - p = editor; + + p = malloc(strlen(editor) + 1 + strlen(filename) + 1); + if (p == NULL) + return; + sprintf(p, "%s %s", editor, filename); if (!(editpid = vfork())) { if (notsetuid) { setgid(getgid()); setuid(getuid()); } - execlp(editor, p, filename, NULL); + system(p); _exit(1); } + free(p); for (;;) { editpid = waitpid(editpid, (int *)&pstat, WUNTRACED); if (editpid == -1) diff --git a/sbin/disklabel/disklabel.c b/sbin/disklabel/disklabel.c index 37d25dedaf4..0124d49d9ef 100644 --- a/sbin/disklabel/disklabel.c +++ b/sbin/disklabel/disklabel.c @@ -1,4 +1,4 @@ -/* $OpenBSD: disklabel.c,v 1.6 1996/05/18 19:06:38 pefo Exp $ */ +/* $OpenBSD: disklabel.c,v 1.7 1996/06/06 12:10:01 deraadt Exp $ */ /* $NetBSD: disklabel.c,v 1.30 1996/03/14 19:49:24 ghudson Exp $ */ /* @@ -936,6 +936,16 @@ editit() int stat; extern char *getenv(); sigset_t sigset, osigset; + char *ed, *p; + + if ((ed = getenv("EDITOR")) == (char *)0) + ed = DEFEDITOR; + p = (char *)malloc(strlen(ed) + 1 + strlen(tmpfil) + 1); + if (!p) + warn("failed to start editor"); + return (0); + } + sprintf(p, "%s %s", ed, tmpfil); sigemptyset(&sigset); sigaddset(&sigset, SIGINT); @@ -943,6 +953,7 @@ editit() sigaddset(&sigset, SIGHUP); sigprocmask(SIG_BLOCK, &sigset, &osigset); while ((pid = fork()) < 0) { + free(p); if (errno != EAGAIN) { sigprocmask(SIG_SETMASK, &osigset, (sigset_t *)0); warn("fork"); @@ -951,17 +962,14 @@ editit() sleep(1); } if (pid == 0) { - char *ed; - sigprocmask(SIG_SETMASK, &osigset, (sigset_t *)0); setgid(getgid()); setuid(getuid()); - if ((ed = getenv("EDITOR")) == (char *)0) - ed = DEFEDITOR; - execlp(ed, ed, tmpfil, 0); - perror(ed); + if (system(p) == -1) + perror(ed); exit(1); } + free(p); while ((xpid = wait(&stat)) >= 0) if (xpid == pid) break; diff --git a/usr.sbin/edquota/edquota.c b/usr.sbin/edquota/edquota.c index 5c3c9ce01cf..a48cf5150dd 100644 --- a/usr.sbin/edquota/edquota.c +++ b/usr.sbin/edquota/edquota.c @@ -42,7 +42,7 @@ static char copyright[] = #ifndef lint /*static char sccsid[] = "from: @(#)edquota.c 8.1 (Berkeley) 6/6/93";*/ -static char *rcsid = "$Id: edquota.c,v 1.7 1996/06/06 12:00:55 deraadt Exp $"; +static char *rcsid = "$Id: edquota.c,v 1.8 1996/06/06 12:10:04 deraadt Exp $"; #endif /* not lint */ /* @@ -329,11 +329,21 @@ editit(tmpfile) int pid, stat; extern char *getenv(); + register char *ed; + char *p; + if ((ed = getenv("EDITOR")) == (char *)0) + ed = _PATH_VI; + p = (char *)malloc(strlen(ed) + 1 + strlen(tmpfile) + 1); + if (!p) + return (0); + sprintf(p, "%s %s", ed, tmpfile); + omask = sigblock(sigmask(SIGINT)|sigmask(SIGQUIT)|sigmask(SIGHUP)); top: if ((pid = fork()) < 0) { extern errno; + free(p); if (errno == EPROCLIM) { fprintf(stderr, "You have too many processes\n"); return(0); @@ -346,20 +356,14 @@ editit(tmpfile) return (0); } if (pid == 0) { - register char *ed; - char *p; - sigsetmask(omask); setgid(getgid()); setuid(getuid()); - if ((ed = getenv("EDITOR")) == (char *)0) - ed = _PATH_VI; - p = (char *)malloc(strlen(ed) + 1 + strlen(tmpfile) + 1); - sprintf(p, "%s %s", ed, tmpfile); if (system(p) == -1) perror(ed); exit(1); } + free(p); waitpid(pid, &stat, 0); sigsetmask(omask); if (!WIFEXITED(stat) || WEXITSTATUS(stat) != 0) |