summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormillert <millert@openbsd.org>2001-12-07 04:20:19 +0000
committermillert <millert@openbsd.org>2001-12-07 04:20:19 +0000
commit3ed079c640f931fc8ae2994f2dc2cd94dd67d35e (patch)
treee7c874c2a7bca92ffbb3409460d8cf988232f131
parentCatch SIGINT and SIGQUIT via the kbintr() signal handler in ypgetnewpasswd() (diff)
downloadwireguard-openbsd-3ed079c640f931fc8ae2994f2dc2cd94dd67d35e.tar.xz
wireguard-openbsd-3ed079c640f931fc8ae2994f2dc2cd94dd67d35e.zip
Use writev() to send status on the backchannel instead of fdopen()ing
fd 3 and using stdio.
-rw-r--r--libexec/login_lchpass/login_lchpass.c28
1 files changed, 18 insertions, 10 deletions
diff --git a/libexec/login_lchpass/login_lchpass.c b/libexec/login_lchpass/login_lchpass.c
index 9c9d72c645e..ad2d54984a9 100644
--- a/libexec/login_lchpass/login_lchpass.c
+++ b/libexec/login_lchpass/login_lchpass.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: login_lchpass.c,v 1.4 2001/12/06 05:37:04 millert Exp $ */
+/* $OpenBSD: login_lchpass.c,v 1.5 2001/12/07 04:20:19 millert Exp $ */
/*-
* Copyright (c) 1995,1996 Berkeley Software Design, Inc. All rights reserved.
@@ -38,6 +38,7 @@
#include <sys/time.h>
#include <sys/resource.h>
#include <sys/file.h>
+#include <sys/uio.h>
#include <sys/wait.h>
#include <err.h>
@@ -52,6 +53,8 @@
#include <stdarg.h>
#include <login_cap.h>
+#define BACK_CHANNEL 3
+
int local_passwd __P((char *, int));
int
@@ -59,7 +62,7 @@ main(argc, argv)
int argc;
char *argv[];
{
- FILE *back;
+ struct iovec iov[2];
struct passwd *pwd;
char localhost[MAXHOSTNAMELEN];
char *username = 0;
@@ -68,6 +71,11 @@ main(argc, argv)
int c;
struct rlimit rl;
+ iov[0].iov_base = BI_SILENT;
+ iov[0].iov_len = sizeof(BI_SILENT) - 1;
+ iov[1].iov_base = "\n";
+ iov[1].iov_len = 1;
+
rl.rlim_cur = 0;
rl.rlim_max = 0;
(void)setrlimit(RLIMIT_CORE, &rl);
@@ -107,14 +115,9 @@ main(argc, argv)
pwd = getpwnam(username);
- if (!(back = fdopen(3, "a"))) {
- syslog(LOG_ERR, "reopening back channel");
- exit(1);
- }
-
if (pwd && *pwd->pw_passwd == '\0') {
syslog(LOG_ERR, "%s attempting to add password", username);
- fprintf(back, BI_SILENT "\n");
+ (void)writev(BACK_CHANNEL, iov, 2);
exit(0);
}
@@ -125,14 +128,19 @@ main(argc, argv)
(void)setpriority(PRIO_PROCESS, 0, -4);
- printf("Changing local password for %s.\n", pwd->pw_name);
+ (void)printf("Changing local password for %s.\n", pwd->pw_name);
p = getpass("Old Password:");
salt = crypt(p, salt);
memset(p, 0, strlen(p));
if (!pwd || strcmp(salt, pwd->pw_passwd) != 0)
exit(1);
+
+ /*
+ * We rely on local_passwd() to block signals during the
+ * critical section.
+ */
local_passwd(pwd->pw_name, 1);
- fprintf(back, BI_SILENT "\n");
+ (void)writev(BACK_CHANNEL, iov, 2);
exit(0);
}