Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 5 Jan 1999 10:43:57 +0100
From:      Jos Backus <Jos.Backus@nl.origin-it.com>
To:        Hidetoshi Shimokawa <simokawa@sat.t.u-tokyo.ac.jp>
Cc:        freebsd-bugs@FreeBSD.ORG
Subject:   Re: bin/9247: pw/pwd_mkdb deadlock on /etc/master.passwd
Message-ID:  <19990105104357.A99381@hal.mpn.cp.philips.com>
In-Reply-To: <199901040640.WAA12583@freefall.freebsd.org>; from Hidetoshi Shimokawa on Sun, Jan 03, 1999 at 10:40:01PM -0800
References:  <199901040640.WAA12583@freefall.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sun, Jan 03, 1999 at 10:40:01PM -0800, Hidetoshi Shimokawa wrote:
>  We need to unlock(close) before calling "pwd_mkdb" or to have non-lock option
>  in pwd_mkdb.c.

Of course you're right. Here's a better patch.  I'm still not really proud of
it because it uses a global, but it does work.


--- pw.c.orig	Tue Jan  5 10:33:27 1999
+++ pw.c	Tue Jan  5 10:37:44 1999
@@ -48,9 +48,11 @@
 
 static struct cargs arglist;
 
+int passwd_fd;
+
 static int      getindex(const char *words[], const char *word);
 static void     cmdhelp(int mode, int which);
-static void     filelock(const char *filename);
+static int      filelock(const char *filename);
 
 
 int
@@ -154,8 +156,8 @@
 	 * Try to lock the master passowrd and group files right away (we
 	 * don't care if it works, since this is just advisory locking.
 	 */
-	filelock(_PATH_GROUP);
-	filelock(_PATH_MASTERPASSWD);
+	(void)filelock(_PATH_GROUP);
+	passwd_fd = filelock(_PATH_MASTERPASSWD);
 	ch = funcs[which] (cnf, mode, &arglist);
 
 	/*
@@ -186,10 +188,10 @@
 	return ch;
 }
 
-static void
+static int
 filelock(const char *filename)
 {
-	open(filename, O_RDONLY | O_EXLOCK, 0);
+	return open(filename, O_RDONLY | O_EXLOCK, 0);
 }
 
 static int
--- pw.h.orig	Tue Jan  5 10:33:31 1999
+++ pw.h	Tue Jan  5 10:34:21 1999
@@ -125,3 +125,5 @@
 
 extern const char *Modes[];
 extern const char *Which[];
+
+extern int passwd_fd;
--- pwupd.c.orig	Tue Jan  5 10:33:43 1999
+++ pwupd.c	Tue Jan  5 10:37:25 1999
@@ -109,6 +109,8 @@
 	int             rc = 0;
 
 	endpwent();
+	if (passwd_fd != -1)
+		close(passwd_fd);
 
 	/*
 	 * First, let's check the see if the database is alright
--- pwupd.h.orig	Tue Jan  5 10:35:14 1999
+++ pwupd.h	Tue Jan  5 10:35:58 1999
@@ -78,4 +78,6 @@
 int extendarray __P((char ***buf, int *buflen, int needed));
 __END_DECLS
 
+extern int passwd_fd;
+
 #endif				/* !_PWUPD_H */

Cheers,
-- 
Jos Backus                          _/  _/_/_/    "Reliability means never
                                   _/  _/   _/     having to say you're sorry."
                                  _/  _/_/_/               -- D. J. Bernstein
                             _/  _/  _/    _/
Jos.Backus@nl.origin-it.com  _/_/   _/_/_/        use Std::Disclaimer;

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?19990105104357.A99381>