Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/bin/rm Rectify race condition in rm -P processing by checkin...



details:   https://anonhg.NetBSD.org/src/rev/baea89de9be3
branches:  trunk
changeset: 779713:baea89de9be3
user:      dholland <dholland%NetBSD.org@localhost>
date:      Wed Jun 13 07:35:37 2012 +0000

description:
Rectify race condition in rm -P processing by checking that the file
we opened is the one we expected to get. Also use O_NOFOLLOW to help
avoid even opening devices, which sometimes produce side effects.

Reported by Radoslaw A. Zarzynski.

diffstat:

 bin/rm/rm.c |  18 ++++++++++++++----
 1 files changed, 14 insertions(+), 4 deletions(-)

diffs (47 lines):

diff -r 54a436646169 -r baea89de9be3 bin/rm/rm.c
--- a/bin/rm/rm.c       Wed Jun 13 01:45:56 2012 +0000
+++ b/bin/rm/rm.c       Wed Jun 13 07:35:37 2012 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: rm.c,v 1.51 2012/01/21 16:38:41 christos Exp $ */
+/* $NetBSD: rm.c,v 1.52 2012/06/13 07:35:37 dholland Exp $ */
 
 /*-
  * Copyright (c) 1990, 1993, 1994, 2003
@@ -39,7 +39,7 @@
 #if 0
 static char sccsid[] = "@(#)rm.c       8.8 (Berkeley) 4/27/95";
 #else
-__RCSID("$NetBSD: rm.c,v 1.51 2012/01/21 16:38:41 christos Exp $");
+__RCSID("$NetBSD: rm.c,v 1.52 2012/06/13 07:35:37 dholland Exp $");
 #endif
 #endif /* not lint */
 
@@ -380,7 +380,7 @@
 static int
 rm_overwrite(char *file, struct stat *sbp)
 {
-       struct stat sb;
+       struct stat sb, sb2;
        int fd, randint;
        char randchar;
 
@@ -394,8 +394,18 @@
                return 0;
 
        /* flags to try to defeat hidden caching by forcing seeks */
-       if ((fd = open(file, O_RDWR|O_SYNC|O_RSYNC, 0)) == -1)
+       if ((fd = open(file, O_RDWR|O_SYNC|O_RSYNC|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;
+       }
 
 #define RAND_BYTES     1
 #define THIS_BYTE      0



Home | Main Index | Thread Index | Old Index