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:
parent
e3b218cd7b
commit
fc1007e186
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=126753
@ -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;
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user