Date: Mon, 15 Jan 2001 06:40:04 -0800 (PST) From: Alex Kapranoff <alex@kapran.bitmcnit.bryansk.su> To: freebsd-bugs@FreeBSD.org Subject: Re: bin/23501: pw destroy /etc/master.passwd when pw executing at the Message-ID: <200101151440.f0FEe4f02199@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR bin/23501; it has been noted by GNATS. From: Alex Kapranoff <alex@kapran.bitmcnit.bryansk.su> To: akimoto@xephion.ne.jp Cc: dhagan@colltech.com, freebsd-gnats-submit@freebsd.org Subject: Re: bin/23501: pw destroy /etc/master.passwd when pw executing at the Date: Fri, 12 Jan 2001 20:47:34 +0300 > If anyone knows how to modify concretely, > please tell me that. > > On Thu, 04 Jan 2001 16:13:50 -0500 > Daniel Hagan <dhagan@colltech.com> wrote: > > > This is almost certainly the fault of fileupdate() in fileupd.c:72. The > > logic is too byzantine for me to figure out right now, but the comment > > at line 181 seems worrisome. > > > > Daniel Tomonobo, try the following patch and see if it helps. diff -ru /usr/src/usr.sbin/pw/edgroup.c ./edgroup.c --- /usr/src/usr.sbin/pw/edgroup.c Thu Dec 14 22:13:45 2000 +++ ./edgroup.c Fri Jan 12 20:21:42 2001 @@ -68,7 +68,7 @@ strcpy(grouptmp, groupfile); strcat(grouptmp, ".new"); - if ((infd = open(groupfile, O_RDWR | O_CREAT, 0644)) != -1) { + if ((infd = open(groupfile, O_RDWR | O_CREAT | O_EXLOCK, 0644)) != -1) { FILE *infp; if ((infp = fdopen(infd, "r+")) == NULL) @@ -76,7 +76,7 @@ else { int outfd; - if ((outfd = open(grouptmp, O_RDWR | O_CREAT | O_TRUNC | O_EXLOCK, 0644)) != -1) { + if ((outfd = open(grouptmp, O_RDWR | O_CREAT | O_TRUNC, 0644)) != -1) { FILE *outfp; if ((outfp = fdopen(outfd, "w+")) == NULL) @@ -207,8 +207,7 @@ /* * This is a gross hack, but we may have corrupted the - * original file. Unfortunately, it will lose preservation - * of the inode. + * original file. */ if (fflush(infp) == EOF || ferror(infp)) rc = rename(grouptmp, groupfile) == 0; diff -ru /usr/src/usr.sbin/pw/fileupd.c ./fileupd.c --- /usr/src/usr.sbin/pw/fileupd.c Thu Dec 14 22:13:45 2000 +++ ./fileupd.c Fri Jan 12 20:20:44 2001 @@ -76,7 +76,7 @@ if (pfxlen <= 1) rc = EINVAL; else { - int infd = open(filename, O_RDWR | O_CREAT, fmode); + int infd = open(filename, O_RDWR | O_CREAT | O_EXLOCK, fmode); if (infd == -1) rc = errno; @@ -92,7 +92,7 @@ strcpy(file, filename); strcat(file, ".new"); - outfd = open(file, O_RDWR | O_CREAT | O_TRUNC | O_EXLOCK, fmode); + outfd = open(file, O_RDWR | O_CREAT | O_TRUNC, fmode); if (outfd == -1) rc = errno; else { @@ -183,8 +183,6 @@ * to 'file'. * This is a gross hack, but we may have * corrupted the original file - * Unfortunately, it will lose the inode - * and hence the lock. */ if (fflush(infp) == EOF || ferror(infp)) rename(file, filename); -- Alex Kapranoff, Voice: +7(0832)791845 We've lived 11 days in the brand new millenium... 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?200101151440.f0FEe4f02199>