mirror of
https://github.com/samba-team/samba.git
synced 2025-08-03 04:22:09 +03:00
r16789: Fix bug #3909, when using ea's getting a directory tries to
read ea's from an msdfs link. Stop it from doing that.
Jerry please merge to 3.0.23.
Jeremy.
(This used to be commit 95e5ace6b4
)
This commit is contained in:
committed by
Gerald (Jerry) Carter
parent
26c0b81d75
commit
192062c4a6
@ -315,6 +315,57 @@ static BOOL set_ea_dos_attribute(connection_struct *conn, const char *path, SMB_
|
|||||||
return True;
|
return True;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
Change a unix mode to a dos mode for an ms dfs link.
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
uint32 dos_mode_msdfs(connection_struct *conn, const char *path,SMB_STRUCT_STAT *sbuf)
|
||||||
|
{
|
||||||
|
uint32 result = 0;
|
||||||
|
|
||||||
|
DEBUG(8,("dos_mode_msdfs: %s\n", path));
|
||||||
|
|
||||||
|
if (!VALID_STAT(*sbuf)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* First do any modifications that depend on the path name. */
|
||||||
|
/* hide files with a name starting with a . */
|
||||||
|
if (lp_hide_dot_files(SNUM(conn))) {
|
||||||
|
const char *p = strrchr_m(path,'/');
|
||||||
|
if (p) {
|
||||||
|
p++;
|
||||||
|
} else {
|
||||||
|
p = path;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p[0] == '.' && p[1] != '.' && p[1] != 0) {
|
||||||
|
result |= aHIDDEN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
result |= dos_mode_from_sbuf(conn, path, sbuf);
|
||||||
|
|
||||||
|
/* Optimization : Only call is_hidden_path if it's not already
|
||||||
|
hidden. */
|
||||||
|
if (!(result & aHIDDEN) && IS_HIDDEN_PATH(conn,path)) {
|
||||||
|
result |= aHIDDEN;
|
||||||
|
}
|
||||||
|
|
||||||
|
DEBUG(8,("dos_mode_msdfs returning "));
|
||||||
|
|
||||||
|
if (result & aHIDDEN) DEBUG(8, ("h"));
|
||||||
|
if (result & aRONLY ) DEBUG(8, ("r"));
|
||||||
|
if (result & aSYSTEM) DEBUG(8, ("s"));
|
||||||
|
if (result & aDIR ) DEBUG(8, ("d"));
|
||||||
|
if (result & aARCH ) DEBUG(8, ("a"));
|
||||||
|
if (result & FILE_ATTRIBUTE_SPARSE ) DEBUG(8, ("[sparse]"));
|
||||||
|
|
||||||
|
DEBUG(8,("\n"));
|
||||||
|
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
Change a unix mode to a dos mode.
|
Change a unix mode to a dos mode.
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
@ -1091,6 +1091,8 @@ static BOOL get_lanman2_dir_entry(connection_struct *conn,
|
|||||||
|
|
||||||
while (!found) {
|
while (!found) {
|
||||||
BOOL got_match;
|
BOOL got_match;
|
||||||
|
BOOL ms_dfs_link = False;
|
||||||
|
|
||||||
/* Needed if we run out of space */
|
/* Needed if we run out of space */
|
||||||
long curr_dirpos = prev_dirpos = dptr_TellDir(conn->dirptr);
|
long curr_dirpos = prev_dirpos = dptr_TellDir(conn->dirptr);
|
||||||
dname = dptr_ReadDirName(conn->dirptr,&curr_dirpos,&sbuf);
|
dname = dptr_ReadDirName(conn->dirptr,&curr_dirpos,&sbuf);
|
||||||
@ -1154,8 +1156,7 @@ static BOOL get_lanman2_dir_entry(connection_struct *conn,
|
|||||||
|
|
||||||
if(lp_host_msdfs() &&
|
if(lp_host_msdfs() &&
|
||||||
lp_msdfs_root(SNUM(conn)) &&
|
lp_msdfs_root(SNUM(conn)) &&
|
||||||
is_msdfs_link(NULL,conn, pathreal, NULL, NULL,
|
((ms_dfs_link = is_msdfs_link(NULL,conn, pathreal, NULL, NULL, &sbuf)) == True)) {
|
||||||
&sbuf)) {
|
|
||||||
|
|
||||||
DEBUG(5,("get_lanman2_dir_entry: Masquerading msdfs link %s as a directory\n", pathreal));
|
DEBUG(5,("get_lanman2_dir_entry: Masquerading msdfs link %s as a directory\n", pathreal));
|
||||||
sbuf.st_mode = (sbuf.st_mode & 0xFFF) | S_IFDIR;
|
sbuf.st_mode = (sbuf.st_mode & 0xFFF) | S_IFDIR;
|
||||||
@ -1168,7 +1169,11 @@ static BOOL get_lanman2_dir_entry(connection_struct *conn,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mode = dos_mode(conn,pathreal,&sbuf);
|
if (ms_dfs_link) {
|
||||||
|
mode = dos_mode_msdfs(conn,pathreal,&sbuf);
|
||||||
|
} else {
|
||||||
|
mode = dos_mode(conn,pathreal,&sbuf);
|
||||||
|
}
|
||||||
|
|
||||||
if (!dir_check_ftype(conn,mode,dirtype)) {
|
if (!dir_check_ftype(conn,mode,dirtype)) {
|
||||||
DEBUG(5,("[%s] attribs didn't match %x\n",fname,dirtype));
|
DEBUG(5,("[%s] attribs didn't match %x\n",fname,dirtype));
|
||||||
|
Reference in New Issue
Block a user