kern/122047: [ext2fs] incorrect handling of UF_IMMUTABLE / UF_APPEND flag on EXT2FS (maybe others)

Ighighi ighighi at gmail.com
Thu May 29 07:40:04 UTC 2008


The following reply was made to PR kern/122047; it has been noted by GNATS.

From: Ighighi <ighighi at gmail.com>
To: bug-followup at freebsd.org
Cc: freebsd-fs at freebsd.org.
Subject: Re: kern/122047: [ext2fs] incorrect handling of UF_IMMUTABLE / UF_APPEND
 flag on EXT2FS (maybe others)
Date: Thu, 29 May 2008 03:06:30 -0430

 This is a multi-part message in MIME format.
 --------------010600060401000202060602
 Content-Type: text/plain; charset=ISO-8859-1; format=flowed
 Content-Transfer-Encoding: 7bit
 
 See attached patch.  Gmail sucks at sending patches to GNATS =(
 
 --------------010600060401000202060602
 Content-Type: text/plain;
  name="ext2fs.patch.txt"
 Content-Transfer-Encoding: 7bit
 Content-Disposition: inline;
  filename="ext2fs.patch.txt"
 
 #
 # (!c) 2008 by Ighighi
 #
 # See http://www.freebsd.org/cgi/query-pr.cgi?pr=kern/122047
 #
 # This patch adds a "vfs.e2fs.userflags" sysctl to permit regular users
 # to set/clear the APPEND/IMMUTABLE filesystem flags on EXT2 filesystems.
 # As a bonus, it also sets st_birthtime to zero.
 #
 # Built and tested on FreeBSD 6.3-STABLE (RELENG_6).
 # Known to patch on -CURRENT
 #
 # To install, run as root:
 #   /sbin/umount -v -t ext2fs -a
 #   /sbin/kldunload -v ext2fs
 #   /usr/bin/patch -d /usr < /path/to/ext2fs.patch
 #   cd /sys/modules/ext2fs/
 #   make clean obj depend && make && make install
 #   /sbin/kldload -v ext2fs
 #   /sbin/sysctl vfs.e2fs.userflags=1  # 0 is default
 #   /sbin/mount -v -t ext2fs -a
 #
 
 --- src/sys/gnu/fs/ext2fs/ext2_inode_cnv.c.orig	2005-06-14 22:36:10.000000000 -0400
 +++ src/sys/gnu/fs/ext2fs/ext2_inode_cnv.c	2008-05-28 15:15:27.527318854 -0430
 @@ -30,11 +30,19 @@
  #include <sys/lock.h>
  #include <sys/stat.h>
  #include <sys/vnode.h>
 +#include <sys/kernel.h>
 +#include <sys/sysctl.h>
  
  #include <gnu/fs/ext2fs/inode.h>
  #include <gnu/fs/ext2fs/ext2_fs.h>
  #include <gnu/fs/ext2fs/ext2_extern.h>
  
 +SYSCTL_DECL(_vfs_e2fs);
 +
 +static int userflags = 0;
 +SYSCTL_INT(_vfs_e2fs, OID_AUTO, userflags, CTLFLAG_RW,
 +    &userflags, 0, "Users may set/clear filesystem flags");
 +
  void
  ext2_print_inode( in )
  	struct inode *in;
 @@ -83,8 +91,17 @@ ext2_ei2i(ei, ip)
  	ip->i_mtime = ei->i_mtime;
  	ip->i_ctime = ei->i_ctime;
  	ip->i_flags = 0;
 -	ip->i_flags |= (ei->i_flags & EXT2_APPEND_FL) ? APPEND : 0;
 -	ip->i_flags |= (ei->i_flags & EXT2_IMMUTABLE_FL) ? IMMUTABLE : 0;
 +	if (userflags) {
 +		if (ei->i_flags & EXT2_APPEND_FL)
 +			ip->i_flags |= UF_APPEND;
 +		if (ei->i_flags & EXT2_IMMUTABLE_FL)
 +			ip->i_flags |= UF_IMMUTABLE;
 +	} else {
 +		if (ei->i_flags & EXT2_APPEND_FL)
 +			ip->i_flags |= APPEND;
 +		if (ei->i_flags & EXT2_IMMUTABLE_FL)
 +			ip->i_flags |= IMMUTABLE;
 +	}
  	ip->i_blocks = ei->i_blocks;
  	ip->i_gen = ei->i_generation;
  	ip->i_uid = ei->i_uid;
 --- src/sys/gnu/fs/ext2fs/ext2_lookup.c.orig	2006-01-04 15:32:00.000000000 -0400
 +++ src/sys/gnu/fs/ext2fs/ext2_lookup.c	2008-05-28 13:35:16.841349269 -0430
 @@ -66,7 +66,7 @@ static int dirchk = 1;
  static int dirchk = 0;
  #endif
  
 -static SYSCTL_NODE(_vfs, OID_AUTO, e2fs, CTLFLAG_RD, 0, "EXT2FS filesystem");
 +SYSCTL_NODE(_vfs, OID_AUTO, e2fs, CTLFLAG_RW, 0, "EXT2FS filesystem");
  SYSCTL_INT(_vfs_e2fs, OID_AUTO, dircheck, CTLFLAG_RW, &dirchk, 0, "");
  
  /*
 --- src/sys/gnu/fs/ext2fs/ext2_vnops.c.orig	2006-02-19 20:53:14.000000000 -0400
 +++ src/sys/gnu/fs/ext2fs/ext2_vnops.c	2008-05-28 07:58:02.189157441 -0430
 @@ -358,6 +358,8 @@ ext2_getattr(ap)
  	vap->va_mtime.tv_nsec = ip->i_mtimensec;
  	vap->va_ctime.tv_sec = ip->i_ctime;
  	vap->va_ctime.tv_nsec = ip->i_ctimensec;
 +	vap->va_birthtime.tv_sec = 0;
 +	vap->va_birthtime.tv_nsec = 0;
  	vap->va_flags = ip->i_flags;
  	vap->va_gen = ip->i_gen;
  	vap->va_blocksize = vp->v_mount->mnt_stat.f_iosize;
 
 --------------010600060401000202060602--


More information about the freebsd-bugs mailing list