Shift file locking to source file instead of temp file. This fixes

data buffering issue that corrupts files if two pw(8)'s run at the
same time as well as changing pw(8) so it uses the same locking
mechanism as PAM, vipw(8), pwd_mkdb(8), etc.

PR:		bin/23501
Submitted by:	Alex Kapranoff <alex (at) kapran (dot) bitmcnit (dot) bryansk (dot) su>
Approved by:	rwatson (mentor)
MFC after:	5 days
This commit is contained in:
Ken Smith 2004-03-08 20:31:37 +00:00
parent e3b218cd7b
commit fc1007e186
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=126753
2 changed files with 5 additions and 8 deletions

View File

@ -68,7 +68,7 @@ editgroups(char *name, char **groups)
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 @@ editgroups(char *name, char **groups)
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 @@ editgroups(char *name, char **groups)
/*
* 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;

View File

@ -76,7 +76,7 @@ fileupdate(char const * filename, mode_t fmode, char const * newline, char const
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 @@ fileupdate(char const * filename, mode_t fmode, char const * newline, char const
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 @@ fileupdate(char const * filename, mode_t fmode, char const * newline, char const
* 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);