summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
authorGerald Carter <jerry@samba.org>2006-07-04 01:43:40 +0000
committerGerald Carter <jerry@samba.org>2006-07-04 01:43:40 +0000
commitfdedd593757368a5133057f4e1ce0822b8ed02d0 (patch)
treef68b69c1dadf5cad0fd8ee86243e8920a48899a8 /source
parent8714a9a83605ce716a3a568fa24dcba74553c248 (diff)
downloadsamba-fdedd593757368a5133057f4e1ce0822b8ed02d0.tar.gz
samba-fdedd593757368a5133057f4e1ce0822b8ed02d0.tar.xz
samba-fdedd593757368a5133057f4e1ce0822b8ed02d0.zip
r16792: minor (but critical fixes) from Jeremy, Volker, & Guenther
Diffstat (limited to 'source')
-rw-r--r--source/nsswitch/winbindd_cache.c1
-rw-r--r--source/nsswitch/winbindd_cred_cache.c4
-rw-r--r--source/smbd/dosmode.c51
-rw-r--r--source/smbd/trans2.c11
4 files changed, 62 insertions, 5 deletions
diff --git a/source/nsswitch/winbindd_cache.c b/source/nsswitch/winbindd_cache.c
index e078c295e17..5cbaa778052 100644
--- a/source/nsswitch/winbindd_cache.c
+++ b/source/nsswitch/winbindd_cache.c
@@ -827,6 +827,7 @@ NTSTATUS wcache_cached_creds_exist(struct winbindd_domain *domain, const DOM_SID
return NT_STATUS_OBJECT_NAME_NOT_FOUND;
}
+ SAFE_FREE(data.dptr);
return NT_STATUS_OK;
}
diff --git a/source/nsswitch/winbindd_cred_cache.c b/source/nsswitch/winbindd_cred_cache.c
index 5fdb79c107a..f5003ac8c63 100644
--- a/source/nsswitch/winbindd_cred_cache.c
+++ b/source/nsswitch/winbindd_cred_cache.c
@@ -80,8 +80,8 @@ NTSTATUS remove_ccache_by_ccname(const char *ccname)
#ifdef DEBUG_PASSWORD
DEBUG(10,("unlocking memory: %p\n", entry->pass));
#endif
- memset(&(entry->pass), 0, len);
- if ((munlock(&entry->pass, len)) == -1) {
+ memset(entry->pass, 0, len);
+ if ((munlock(entry->pass, len)) == -1) {
DEBUG(0,("failed to munlock memory: %s (%d)\n",
strerror(errno), errno));
return map_nt_error_from_unix(errno);
diff --git a/source/smbd/dosmode.c b/source/smbd/dosmode.c
index 583b3f19e76..61145fde2f0 100644
--- a/source/smbd/dosmode.c
+++ b/source/smbd/dosmode.c
@@ -316,6 +316,57 @@ static BOOL set_ea_dos_attribute(connection_struct *conn, const char *path, SMB_
}
/****************************************************************************
+ 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.
****************************************************************************/
diff --git a/source/smbd/trans2.c b/source/smbd/trans2.c
index 27fd62be7fd..9030737b1b4 100644
--- a/source/smbd/trans2.c
+++ b/source/smbd/trans2.c
@@ -1091,6 +1091,8 @@ static BOOL get_lanman2_dir_entry(connection_struct *conn,
while (!found) {
BOOL got_match;
+ BOOL ms_dfs_link = False;
+
/* Needed if we run out of space */
long curr_dirpos = prev_dirpos = dptr_TellDir(conn->dirptr);
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() &&
lp_msdfs_root(SNUM(conn)) &&
- is_msdfs_link(NULL,conn, pathreal, NULL, NULL,
- &sbuf)) {
+ ((ms_dfs_link = is_msdfs_link(NULL,conn, pathreal, NULL, NULL, &sbuf)) == True)) {
DEBUG(5,("get_lanman2_dir_entry: Masquerading msdfs link %s as a directory\n", pathreal));
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)) {
DEBUG(5,("[%s] attribs didn't match %x\n",fname,dirtype));