diff options
author | kensmith <kensmith@FreeBSD.org> | 2004-03-08 20:31:37 +0000 |
---|---|---|
committer | kensmith <kensmith@FreeBSD.org> | 2004-03-08 20:31:37 +0000 |
commit | 7d850e036915647286ba968117268c61c4896e3e (patch) | |
tree | 0420a810dee6b94bcc06fa437eddfa0ac14552dc /usr.sbin/pw/edgroup.c | |
parent | ed1fac1d1e69ddd592d995c02c0d042c199ced61 (diff) | |
download | FreeBSD-src-7d850e036915647286ba968117268c61c4896e3e.zip FreeBSD-src-7d850e036915647286ba968117268c61c4896e3e.tar.gz |
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
Diffstat (limited to 'usr.sbin/pw/edgroup.c')
-rw-r--r-- | usr.sbin/pw/edgroup.c | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/usr.sbin/pw/edgroup.c b/usr.sbin/pw/edgroup.c index 40313d2..1cc46b4 100644 --- a/usr.sbin/pw/edgroup.c +++ b/usr.sbin/pw/edgroup.c @@ -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; |