Fix race condition in noclobber option.

Formerly, it was possible for the file to be created between the check if it
existed and the open; the contents would then be lost.

Because this must use O_EXCL, noclobber > will not create a file through a
symlink anymore. This agrees with behaviour of other shells.

Approved by:	ed (mentor) (implicit)
This commit is contained in:
Jilles Tjoelker 2009-06-20 20:44:27 +00:00
parent 556de497fa
commit deb090cba3
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=194560

View File

@ -188,13 +188,25 @@ openredirect(union node *redir, char memory[10])
error("cannot create %s: %s", fname, strerror(errno));
goto movefd;
case NTO:
fname = redir->nfile.expfname;
if (Cflag && stat(fname, &sb) != -1 && S_ISREG(sb.st_mode))
error("cannot create %s: %s", fname,
strerror(EEXIST));
if ((f = open(fname, O_WRONLY|O_CREAT|O_TRUNC, 0666)) < 0)
error("cannot create %s: %s", fname, strerror(errno));
goto movefd;
if (Cflag) {
fname = redir->nfile.expfname;
if (stat(fname, &sb) == -1) {
if ((f = open(fname, O_WRONLY|O_CREAT|O_EXCL, 0666)) < 0)
error("cannot create %s: %s", fname, strerror(errno));
} else if (!S_ISREG(sb.st_mode)) {
if ((f = open(fname, O_WRONLY, 0666)) < 0)
error("cannot create %s: %s", fname, strerror(errno));
if (fstat(f, &sb) != -1 && S_ISREG(sb.st_mode)) {
close(f);
error("cannot create %s: %s", fname,
strerror(EEXIST));
}
} else
error("cannot create %s: %s", fname,
strerror(EEXIST));
goto movefd;
}
/* FALLTHROUGH */
case NCLOBBER:
fname = redir->nfile.expfname;
if ((f = open(fname, O_WRONLY|O_CREAT|O_TRUNC, 0666)) < 0)