linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] HFSPlus: simplify inode mode settting logic
@ 2007-06-23 23:29 Wyatt Banks
  2007-06-24 16:27 ` Roman Zippel
  0 siblings, 1 reply; 2+ messages in thread
From: Wyatt Banks @ 2007-06-23 23:29 UTC (permalink / raw)
  To: linux-kernel; +Cc: zippel

From:	Wyatt Banks <wyatt@banksresearch.com>

HFSPlus: Fix broken inode mode setting logic.  Fix broken umask mount option.

Signed-off-by:	Wyatt Banks <wyatt@banksresearch.com>
---
Patched against 2.6.21.5

hfsplus_cat_read_inode() decides if the selected inode is a directory or not.
It then sets the 3rd parameter of hfsplus_get_perms() accordingly.  Inside
hfsplus_get_perms() it again decides based on its 3rd parameter if the inode
is a directory or not.  Besides this redundancy, mode is the BSD file type and mode
bits (see Apple TechNote 1150 for details) and is never 0.  This makes a large
portion of the branching logic unused.  What actually does happen in the branching
is that the UGO mode bits are combined with the directory or regular file bit after
the 2nd decision and this resultant mode is assigned to the inode.  This also loses
suid, sgid, sticky, pipe, fifo, etc.

This patch also fixes the umask mount option as a result.  I figured instead of
filing a bug report, I'd just go ahead and fix it. :-)

diff -uprN -X linux-2.6.21.5/Documentation/dontdiff linux-2.6.21.5/fs/hfsplus/inode.c linux-2.6.21.5-devel/fs/hfsplus/inode.c
--- linux-2.6.21.5/fs/hfsplus/inode.c	2007-06-11 14:37:06.000000000 -0400
+++ linux-2.6.21.5-devel/fs/hfsplus/inode.c	2007-06-23 18:23:57.000000000 -0400
@@ -173,7 +173,7 @@ out:
	return NULL;
 }

-static void hfsplus_get_perms(struct inode *inode, struct hfsplus_perm *perms, int dir)
+static void hfsplus_get_perms(struct inode *inode, struct hfsplus_perm *perms)
 {
	struct super_block *sb = inode->i_sb;
	u16 mode;
@@ -188,14 +188,7 @@ static void hfsplus_get_perms(struct ino
	if (!inode->i_gid && !mode)
		inode->i_gid = HFSPLUS_SB(sb).gid;

-	if (dir) {
-		mode = mode ? (mode & S_IALLUGO) :
-			(S_IRWXUGO & ~(HFSPLUS_SB(sb).umask));
-		mode |= S_IFDIR;
-	} else if (!mode)
-		mode = S_IFREG | ((S_IRUGO|S_IWUGO) &
-			~(HFSPLUS_SB(sb).umask));
-	inode->i_mode = mode;
+	inode->i_mode = mode & ~(HFSPLUS_SB(sb).umask);

	HFSPLUS_I(inode).rootflags = perms->rootflags;
	HFSPLUS_I(inode).userflags = perms->userflags;
@@ -415,7 +408,7 @@ int hfsplus_cat_read_inode(struct inode
			/* panic? */;
		hfs_bnode_read(fd->bnode, &entry, fd->entryoffset,
					sizeof(struct hfsplus_cat_folder));
-		hfsplus_get_perms(inode, &folder->permissions, 1);
+		hfsplus_get_perms(inode, &folder->permissions);
		inode->i_nlink = 1;
		inode->i_size = 2 + be32_to_cpu(folder->valence);
		inode->i_atime = hfsp_mt2ut(folder->access_date);
@@ -435,7 +428,7 @@ int hfsplus_cat_read_inode(struct inode

		hfsplus_inode_read_fork(inode, HFSPLUS_IS_DATA(inode) ?
					&file->data_fork : &file->rsrc_fork);
-		hfsplus_get_perms(inode, &file->permissions, 0);
+		hfsplus_get_perms(inode, &file->permissions);
		inode->i_nlink = 1;
		if (S_ISREG(inode->i_mode)) {
			if (file->permissions.dev)

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH] HFSPlus: simplify inode mode settting logic
  2007-06-23 23:29 [PATCH] HFSPlus: simplify inode mode settting logic Wyatt Banks
@ 2007-06-24 16:27 ` Roman Zippel
  0 siblings, 0 replies; 2+ messages in thread
From: Roman Zippel @ 2007-06-24 16:27 UTC (permalink / raw)
  To: Wyatt Banks; +Cc: linux-kernel

Hi,

On Sat, 23 Jun 2007, Wyatt Banks wrote:

> Besides this redundancy, mode is the BSD file type and mode
> bits (see Apple TechNote 1150 for details) and is never 0.

This is wrong, there is an extra note:

"If the S_IFMT field (upper 4 bits) of the fileMode field is zero, then 
Mac OS X assumes that the permissions structure is uninitialized"

bye, Roman

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2007-06-24 16:27 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-06-23 23:29 [PATCH] HFSPlus: simplify inode mode settting logic Wyatt Banks
2007-06-24 16:27 ` Roman Zippel

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).