[patch] Allow chown of directories from W2k domain clients
Andrew Furey
andrew at terminus.net.au
Wed Feb 19 08:18:13 GMT 2003
Hi all,
I never did get any replies to my original postings to this list (as
well as samba@), so I wrote my own patch. I just _know_ that there are
going to be several folks point out that this is a hack, and would never
survive an audit, etc... but it does the job, which is what our client
wanted ;)
Our existing machine is a domain member server, joined to a W2k-based
domain in mixed mode (using winbind+NSS to get user details), which is
using ACLs (on ext3) to provide file serving capabilities. The (admin)
users are then trying to "take ownership" on files and directories
within the shares. This is (I presume) a very specific scenario, or else
I presumably would have had more replies before now (changing ownership
isn't that uncommon an operation, is it?)
Note that this patch isn't perfect; it doesn't check to see if the user
actually has write permission on the directory, which is of course a big
security hole. Nor does it seem to work from an NT4 client (comes up
with "Access Denied"). I didn't get a chance to seriously look at the
NT4 problem, but from what I saw of the logs it seems to be using a
completely different section of the code.
Comments (and flames) encouraged...
Andrew
--
ANDREW FUREY <andrew at terminus.net.au> - Sysadmin/developer for Terminus.
Providing online networks of Australian lawyers (http://www.ilaw.com.au)
and Linux experts (http://www.linuxconsultants.com.au) for instant help!
Disclaimer: http://www.terminus.net.au/disclaimer.html. GCS L+++ P++ t++
-------------- next part --------------
diff -u -r samba-2.2.7a-orig/source/smbd/open.c samba-2.2.7a/source/smbd/open.c
--- samba-2.2.7a-orig/source/smbd/open.c 2002-12-10 22:58:17.000000000 +0800
+++ samba-2.2.7a/source/smbd/open.c 2003-02-12 08:53:44.000000000 +0800
@@ -49,6 +49,11 @@
fd = conn->vfs_ops.open(conn,dos_to_unix_static(fname),flags,mode);
}
+ /* Don't fail automatically if a directory (andrew at terminus.net.au) */
+ if (strcmp(strerror(errno),"Is a directory") == 0) {
+ fd = conn->vfs_ops.opendir(conn,dos_to_unix_static(fname));
+ }
+
DEBUG(10,("fd_open: name %s, flags = 0%o mode = 0%o, fd = %d. %s\n", fname,
flags, (int)mode, fd, (fd == -1) ? strerror(errno) : "" ));
diff -u -r samba-2.2.7a-orig/source/smbd/posix_acls.c samba-2.2.7a/source/smbd/posix_acls.c
--- samba-2.2.7a-orig/source/smbd/posix_acls.c 2002-12-10 22:58:17.000000000 +0800
+++ samba-2.2.7a/source/smbd/posix_acls.c 2003-02-12 09:00:51.000000000 +0800
@@ -2173,6 +2173,10 @@
mode_t orig_mode = (mode_t)0;
uid_t orig_uid;
gid_t orig_gid;
+ int chown_return;
+ char fullpath[1000];
+ /* have to specify a size - hopefully 1000 chars for the full file
+ name (on the server) should be enough (andrew at terminus.net.au) */
DEBUG(10,("set_nt_acl: called for file %s\n", fsp->fsp_name ));
@@ -2214,7 +2218,8 @@
DEBUG(3,("set_nt_acl: chown %s. uid = %u, gid = %u.\n",
fsp->fsp_name, (unsigned int)user, (unsigned int)grp ));
- if(try_chown( fsp->conn, fsp->fsp_name, user, grp) == -1) {
+ /* also check if it's a directory (andrew at terminus.net.au) */
+ if((try_chown( fsp->conn, fsp->fsp_name, user, grp) == -1) && (fsp->is_directory == 0)) {
DEBUG(3,("set_nt_acl: chown %s, %u, %u failed. Error = %s.\n",
fsp->fsp_name, (unsigned int)user, (unsigned int)grp, strerror(errno) ));
return False;
@@ -2254,6 +2259,16 @@
&file_ace_list, &dir_ace_list, security_info_sent, psd);
if ((file_ace_list == NULL) && (dir_ace_list == NULL)) {
+ /* if we're here we're probably trying to chown a directory
+ (fails normally) - andrew at terminus.net.au */
+ fstrcpy(fullpath, conn->connectpath);
+ fstrcat(fullpath, "/");
+ fstrcat(fullpath, fsp->fsp_name);
+ become_root();
+ chown_return = chown(fullpath, (unsigned int)user, -1);
+ unbecome_root();
+ DEBUG(5,("AndrewF: chown of %s returned %u\n",
+ fullpath, chown_return));
/* W2K traverse DACL set - ignore. */
return True;
}
More information about the samba-technical
mailing list