From f59b2daf2885b6bba8bbd41dd0cde389f07f1a96 Mon Sep 17 00:00:00 2001 From: "Todd C. Miller" Date: Sun, 22 Jun 1997 23:57:24 +0000 Subject: Use O_EXLOCK option of open(2) to open /etc/ptmp with an exclusive lock. This fixes a DOS bug where a user could run passwd(1) and send it a SIGKILL, thus leaving /etc/ptmp in place. --- lib/libutil/passwd.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'lib/libutil/passwd.c') diff --git a/lib/libutil/passwd.c b/lib/libutil/passwd.c index 91f15e624e4..4481a28abc3 100644 --- a/lib/libutil/passwd.c +++ b/lib/libutil/passwd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: passwd.c,v 1.10 1997/06/17 10:10:42 niklas Exp $ */ +/* $OpenBSD: passwd.c,v 1.11 1997/06/22 23:57:23 millert Exp $ */ /* * Copyright (c) 1987, 1993, 1994, 1995 @@ -34,7 +34,7 @@ */ #if defined(LIBC_SCCS) && !defined(lint) -static char rcsid[] = "$OpenBSD: passwd.c,v 1.10 1997/06/17 10:10:42 niklas Exp $"; +static char rcsid[] = "$OpenBSD: passwd.c,v 1.11 1997/06/22 23:57:23 millert Exp $"; #endif /* LIBC_SCCS and not lint */ #include @@ -252,10 +252,10 @@ pw_lock(retries) return (-1); /* Acquire the lock file. */ old_mode = umask(0); - fd = open(pw_lck, O_WRONLY|O_CREAT|O_EXCL, 0600); - for (i = 0; i < retries && fd < 0 && errno == EEXIST; i++) { + fd = open(pw_lck, O_WRONLY|O_CREAT|O_TRUNC|O_NONBLOCK|O_EXLOCK, 0600); + for (i = 0; i < retries && fd < 0 && errno == EAGAIN; i++) { sleep(1); - fd = open(pw_lck, O_WRONLY|O_CREAT|O_EXCL, 0600); + fd = open(pw_lck, O_WRONLY|O_CREAT|O_TRUNC|O_NONBLOCK|O_EXLOCK, 0600); } umask(old_mode); return (fd); -- cgit v1.2.3