Bug#310982: smbmount does not honor uid and gid options with 2.4 kernel

Horms horms at debian.org
Thu Jul 7 03:27:53 GMT 2005


On Wed, Jul 06, 2005 at 07:17:20PM +0900, Horms wrote:
> On Tue, Jun 07, 2005 at 07:44:25PM -0700, Steve Langasek wrote:
> > On Tue, Jun 07, 2005 at 06:42:33PM +0900, Horms wrote:
> > > On Mon, Jun 06, 2005 at 04:19:28AM -0700, Steve Langasek wrote:
> > > > reopen 310982
> > > > tags 310982 security
> > > > thanks
> > > > 
> > > > samba 3.0.14a-4 didn't make the cut for sarge, so this bug is still present
> > > > in the release.  That being the case, it would be far better to fix this bug
> > > > in the kernel instead of in smbfs.
> > 
> > > Hi Steve,
> > 
> > > I'm kind of trying to read your mind here, but are you thinking
> > > of just making a kernel that doesn't do SMB_CAP_UNIX at all?
> > 
> > I think the best answer is for the kernel to track whether
> > uid,gid,fmask,dmask options were specified, and if so, to ignore the
> > permission info sent by the CAP_UNIX-enabled server.
> > 
> > That may require changes to the ioctl interface, though; I'd have to check
> > again whether there's any distinction between not setting the option, and
> > setting the option to 0.
> 
> Sorry for being slack about this. I scraped together a few moments to
> look into this. parse_options() in fs/smbfs/inode.c seems to handle
> the options parsed to a mount, and it does indeed seem to differentiate
> betwen an unset option and an option set to 0. I'll poke a bit futher
> to find where to put your suggested hack, but I have to run now.

Hi all,

There has been a lot of disucssion of how to resolve this bug,
which can be found at the following URL.

http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=310982

I am pretty detached from this discussion, though it seems
to me that there is no particularly good solution for Sarge.
But the idea of disabling the use of CAP_UNIX if uid,gid,fmask or dmask
are specified does make sense to me. I have gone ahead and coded this
up in the surprisingly simple patch which is attached.

Samba people, my main question is, can smb_newconn() be called before
server.mnt.flags is set?  If so my patch is invalid.

-- 
Horms
-------------- next part --------------
diff -pru kernel-source-2.4.27.orig/include/linux/smb_mount.h kernel-source-2.4.27/include/linux/smb_mount.h
--- kernel-source-2.4.27.orig/include/linux/smb_mount.h	2004-02-18 22:36:32.000000000 +0900
+++ kernel-source-2.4.27/include/linux/smb_mount.h	2005-07-07 11:27:51.000000000 +0900
@@ -37,7 +37,9 @@ struct smb_mount_data {
 #define SMB_MOUNT_OLDATTR	0x0002	/* Use core getattr (Win 95 speedup) */
 #define SMB_MOUNT_DIRATTR	0x0004	/* Use find_first for getattr */
 #define SMB_MOUNT_CASE		0x0008	/* Be case sensitive */
-
+#define SMB_MOUNT_NO_CAP_UNIX	0x0010	/* Hack for Debian to disable 
+					   SMB_CAP_UNIX if uid, gid, fmask
+					   or dmask are set. See Bug#310982 */
 
 struct smb_mount_data_kernel {
 	int version;
diff -pru kernel-source-2.4.27.orig/fs/smbfs/inode.c kernel-source-2.4.27/fs/smbfs/inode.c
--- kernel-source-2.4.27.orig/fs/smbfs/inode.c	2004-02-18 22:36:31.000000000 +0900
+++ kernel-source-2.4.27/fs/smbfs/inode.c	2005-07-07 10:50:56.000000000 +0900
@@ -286,10 +286,10 @@ static struct option opts[] = {
 	{ "oldattr",	SMB_MOUNT_OLDATTR, 1 },
 	{ "dirattr",	SMB_MOUNT_DIRATTR, 1 },
 	{ "case",	SMB_MOUNT_CASE, 1 },
-	{ "uid",	0, 'u' },
-	{ "gid",	0, 'g' },
-	{ "file_mode",	0, 'f' },
-	{ "dir_mode",	0, 'd' },
+	{ "uid",	SMB_MOUNT_NO_CAP_UNIX, 'u' },
+	{ "gid",	SMB_MOUNT_NO_CAP_UNIX, 'g' },
+	{ "file_mode",	SMB_MOUNT_NO_CAP_UNIX, 'f' },
+	{ "dir_mode",	SMB_MOUNT_NO_CAP_UNIX, 'd' },
 	{ "iocharset",	0, 'i' },
 	{ "codepage",	0, 'c' },
 	{ "ttl",	0, 't' },
diff -pru kernel-source-2.4.27.orig/fs/smbfs/proc.c kernel-source-2.4.27/fs/smbfs/proc.c
--- kernel-source-2.4.27.orig/fs/smbfs/proc.c	2005-05-19 19:29:38.000000000 +0900
+++ kernel-source-2.4.27/fs/smbfs/proc.c	2005-07-07 10:49:35.000000000 +0900
@@ -916,7 +916,8 @@ smb_newconn(struct smb_sb_info *server, 
 		VERBOSE("LFS enabled\n");
 	}
 #ifndef CONFIG_SMB_UNIX
-	server->opt.capabilities &= ~SMB_CAP_UNIX;
+	if (!server->mnt.flags & SMB_MOUNT_NO_CAP_UNIX)
+		server->opt.capabilities &= ~SMB_CAP_UNIX;
 #endif
 	if (server->opt.capabilities & SMB_CAP_UNIX) {
 		struct inode *inode;


More information about the samba-technical mailing list