svn commit: r237615 - stable/9/bin/rm
Xin LI
delphij at FreeBSD.org
Wed Jun 27 00:31:31 UTC 2012
Author: delphij
Date: Wed Jun 27 00:31:30 2012
New Revision: 237615
URL: http://svn.freebsd.org/changeset/base/237615
Log:
MFC r237339:
Polish previous revision: if the fts_* routines have lstat()'ed the
directory entry then use the struct stat from that instead of doing
it again, and skip the rm_overwrite() call if fts_read() indicated
that the entry couldn't be a regular file.
Obtained from: OpenBSD
MFC r237284 (kevlo):
Fix potential symlink race condition in "rm -P" by adding a check
that the file we have opened is the one we expected. Also open in
non-blocking mode to avoid a potential hang with FIFOs.
Obtained from: NetBSD via OpenBSD
Modified:
stable/9/bin/rm/rm.c
Directory Properties:
stable/9/bin/rm/ (props changed)
Modified: stable/9/bin/rm/rm.c
==============================================================================
--- stable/9/bin/rm/rm.c Tue Jun 26 23:31:57 2012 (r237614)
+++ stable/9/bin/rm/rm.c Wed Jun 27 00:31:30 2012 (r237615)
@@ -301,10 +301,16 @@ rm_tree(char **argv)
if (fflag)
continue;
/* FALLTHROUGH */
- default:
+
+ case FTS_F:
+ case FTS_NSOK:
if (Pflag)
- if (!rm_overwrite(p->fts_accpath, NULL))
+ if (!rm_overwrite(p->fts_accpath, p->fts_info ==
+ FTS_NSOK ? NULL : p->fts_statp))
continue;
+ /* FALLTHROUGH */
+
+ default:
rval = unlink(p->fts_accpath);
if (rval == 0 || (fflag && errno == ENOENT)) {
if (rval == 0 && vflag)
@@ -408,7 +414,7 @@ rm_file(char **argv)
int
rm_overwrite(char *file, struct stat *sbp)
{
- struct stat sb;
+ struct stat sb, sb2;
struct statfs fsb;
off_t len;
int bsize, fd, wlen;
@@ -427,8 +433,15 @@ rm_overwrite(char *file, struct stat *sb
file, sbp->st_ino);
return (0);
}
- if ((fd = open(file, O_WRONLY, 0)) == -1)
+ if ((fd = open(file, O_WRONLY|O_NONBLOCK|O_NOFOLLOW, 0)) == -1)
+ goto err;
+ if (fstat(fd, &sb2))
goto err;
+ if (sb2.st_dev != sbp->st_dev || sb2.st_ino != sbp->st_ino ||
+ !S_ISREG(sb2.st_mode)) {
+ errno = EPERM;
+ goto err;
+ }
if (fstatfs(fd, &fsb) == -1)
goto err;
bsize = MAX(fsb.f_iosize, 1024);
More information about the svn-src-stable-9
mailing list