diff options
author | Richard Sharpe <realrichardsharpe@gmail.com> | 2013-08-18 07:34:31 -0700 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2013-08-19 22:21:34 +0200 |
commit | 74829fecd7a4e806ee441cd75141bede2eefef1a (patch) | |
tree | e47286eebe0af599bfa5386b198097bf575aba83 | |
parent | 02618cc58a49864bd0bf280d9f13a7f39fcf9658 (diff) | |
download | samba-74829fecd7a4e806ee441cd75141bede2eefef1a.tar.gz samba-74829fecd7a4e806ee441cd75141bede2eefef1a.tar.bz2 samba-74829fecd7a4e806ee441cd75141bede2eefef1a.zip |
Fix bug #10097 - MacOSX 10.9 will not follow path-based DFS referrals handed out by Samba.
Windows overloads the EA Length field in the DIRECTORY INFO leves of FIND FIRST/FIND NEXT.
This field indicates either the REPARSE_TAG if the file/folder has a reparse proint or
the EA Length if it has EAs, and is the fundamental reason you cannot have both on a
file or folder.
Signed-off-by: Richard Sharpe <rsharpe@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
Autobuild-User(master): Jeremy Allison <jra@samba.org>
Autobuild-Date(master): Mon Aug 19 22:21:34 CEST 2013 on sn-devel-104
-rw-r--r-- | source3/include/ntioctl.h | 1 | ||||
-rw-r--r-- | source3/smbd/dosmode.c | 5 | ||||
-rw-r--r-- | source3/smbd/trans2.c | 19 |
3 files changed, 19 insertions, 6 deletions
diff --git a/source3/include/ntioctl.h b/source3/include/ntioctl.h index e09e1c85db..65bed645b5 100644 --- a/source3/include/ntioctl.h +++ b/source3/include/ntioctl.h @@ -26,6 +26,7 @@ #define IO_REPARSE_TAG_MOUNT_POINT 0xA0000003 #define IO_REPARSE_TAG_HSM 0xC0000004 #define IO_REPARSE_TAG_SIS 0x80000007 +#define IO_REPARSE_TAG_DFS 0x8000000A /* For FSCTL_GET_SHADOW_COPY_DATA ...*/ diff --git a/source3/smbd/dosmode.c b/source3/smbd/dosmode.c index a6ad107a01..2d07dd9aa7 100644 --- a/source3/smbd/dosmode.c +++ b/source3/smbd/dosmode.c @@ -489,6 +489,11 @@ uint32 dos_mode_msdfs(connection_struct *conn, result = filter_mode_by_protocol(result); + /* + * Add in that it is a reparse point + */ + result |= FILE_ATTRIBUTE_REPARSE_POINT; + DEBUG(8,("dos_mode_msdfs returning ")); if (result & FILE_ATTRIBUTE_HIDDEN) DEBUG(8, ("h")); diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c index 2bff483d70..81f80c3bcb 100644 --- a/source3/smbd/trans2.c +++ b/source3/smbd/trans2.c @@ -24,6 +24,7 @@ */ #include "includes.h" +#include "ntioctl.h" #include "system/filesys.h" #include "version.h" #include "smbd/smbd.h" @@ -1817,12 +1818,14 @@ static bool smbd_marshall_dir_entry(TALLOC_CTX *ctx, SOFF_T(p,0,allocation_size); p += 8; SIVAL(p,0,mode); p += 4; q = p; p += 4; /* q is placeholder for name length. */ - { + if (mode & FILE_ATTRIBUTE_REPARSE_POINT) { + SIVAL(p, 0, IO_REPARSE_TAG_DFS); + } else { unsigned int ea_size = estimate_ea_size(conn, NULL, smb_fname); SIVAL(p,0,ea_size); /* Extended attributes */ - p += 4; } + p += 4; /* Clear the short name buffer. This is * IMPORTANT as not doing so will trigger * a Win2k client bug. JRA. @@ -1994,12 +1997,14 @@ static bool smbd_marshall_dir_entry(TALLOC_CTX *ctx, SOFF_T(p,0,allocation_size); p += 8; SIVAL(p,0,mode); p += 4; q = p; p += 4; /* q is placeholder for name length. */ - { + if (mode & FILE_ATTRIBUTE_REPARSE_POINT) { + SIVAL(p, 0, IO_REPARSE_TAG_DFS); + } else { unsigned int ea_size = estimate_ea_size(conn, NULL, smb_fname); SIVAL(p,0,ea_size); /* Extended attributes */ - p +=4; } + p += 4; SIVAL(p,0,0); p += 4; /* Unknown - reserved ? */ SBVAL(p,0,file_index); p += 8; len = srvstr_push(base_data, flags2, p, @@ -2040,12 +2045,14 @@ static bool smbd_marshall_dir_entry(TALLOC_CTX *ctx, SOFF_T(p,0,allocation_size); p += 8; SIVAL(p,0,mode); p += 4; q = p; p += 4; /* q is placeholder for name length */ - { + if (mode & FILE_ATTRIBUTE_REPARSE_POINT) { + SIVAL(p, 0, IO_REPARSE_TAG_DFS); + } else { unsigned int ea_size = estimate_ea_size(conn, NULL, smb_fname); SIVAL(p,0,ea_size); /* Extended attributes */ - p +=4; } + p += 4; /* Clear the short name buffer. This is * IMPORTANT as not doing so will trigger * a Win2k client bug. JRA. |