From: Jeremy Allison Date: Wed, 21 Aug 2013 19:20:48 +0000 (-0700) Subject: Fix the UNIX extensions CHOWN calls to use FCHOWN if available, else LCHOWN. X-Git-Tag: talloc-2.1.0~90 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d1593a20f3a5ebf287477dfa8f5ab31dca3dd0c3;p=thirdparty%2Fsamba.git Fix the UNIX extensions CHOWN calls to use FCHOWN if available, else LCHOWN. UNIX extensions calls must never deref links. Signed-off-by: Jeremy Allison Reviewed-by: Simo Sorce Autobuild-User(master): Jeremy Allison Autobuild-Date(master): Mon Aug 26 20:19:46 CEST 2013 on sn-devel-104 --- diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c index 3cd21926b18..b6cb3cc3490 100644 --- a/source3/smbd/trans2.c +++ b/source3/smbd/trans2.c @@ -7155,12 +7155,15 @@ static NTSTATUS smb_set_file_unix_basic(connection_struct *conn, (unsigned int)set_owner, smb_fname_str_dbg(smb_fname))); - if (S_ISLNK(sbuf.st_ex_mode)) { + if (fsp && fsp->fh->fd != -1) { + ret = SMB_VFS_FCHOWN(fsp, set_owner, (gid_t)-1); + } else { + /* + * UNIX extensions calls must always operate + * on symlinks. + */ ret = SMB_VFS_LCHOWN(conn, smb_fname->base_name, set_owner, (gid_t)-1); - } else { - ret = SMB_VFS_CHOWN(conn, smb_fname->base_name, - set_owner, (gid_t)-1); } if (ret != 0) { @@ -7178,12 +7181,23 @@ static NTSTATUS smb_set_file_unix_basic(connection_struct *conn, if ((set_grp != (uid_t)SMB_GID_NO_CHANGE) && (sbuf.st_ex_gid != set_grp)) { + int ret; + DEBUG(10,("smb_set_file_unix_basic: SMB_SET_FILE_UNIX_BASIC " "changing group %u for file %s\n", (unsigned int)set_owner, smb_fname_str_dbg(smb_fname))); - if (SMB_VFS_CHOWN(conn, smb_fname->base_name, (uid_t)-1, - set_grp) != 0) { + if (fsp && fsp->fh->fd != -1) { + ret = SMB_VFS_FCHOWN(fsp, set_owner, (gid_t)-1); + } else { + /* + * UNIX extensions calls must always operate + * on symlinks. + */ + ret = SMB_VFS_LCHOWN(conn, smb_fname->base_name, (uid_t)-1, + set_grp); + } + if (ret != 0) { status = map_nt_error_from_unix(errno); if (delete_on_fail) { SMB_VFS_UNLINK(conn, smb_fname);