diff options
author | Jim McDonough <jmcd@samba.org> | 2008-05-13 18:42:18 -0400 |
---|---|---|
committer | Jim McDonough <jmcd@samba.org> | 2008-05-13 18:42:18 -0400 |
commit | 2ca5098e3591fa006a90f2f44dc1d5455f501703 (patch) | |
tree | ea90fcb78e241496e8cc1c9e5ae70022b4012050 | |
parent | a6b0ea8ee341fde28e568f8e1a4f16d9a89425c8 (diff) | |
parent | b8398d19af01cbdaec3af6c264e4d073fa85f78d (diff) | |
download | samba-2ca5098e3591fa006a90f2f44dc1d5455f501703.tar.gz samba-2ca5098e3591fa006a90f2f44dc1d5455f501703.tar.bz2 samba-2ca5098e3591fa006a90f2f44dc1d5455f501703.zip |
Merge branch 'v3-3-test' of git://git.samba.org/samba into 3.3-test
(This used to be commit 6dd44ebf22762e852b43e7dbcd095a58cc45abad)
-rw-r--r-- | source3/smbd/conn.c | 25 | ||||
-rw-r--r-- | source3/smbd/msdfs.c | 46 |
2 files changed, 63 insertions, 8 deletions
diff --git a/source3/smbd/conn.c b/source3/smbd/conn.c index e899af1319..125277be21 100644 --- a/source3/smbd/conn.c +++ b/source3/smbd/conn.c @@ -63,10 +63,10 @@ bool conn_snum_used(int snum) return(False); } - /**************************************************************************** -find a conn given a cnum + Find a conn given a cnum. ****************************************************************************/ + connection_struct *conn_find(unsigned cnum) { int count=0; @@ -84,6 +84,27 @@ connection_struct *conn_find(unsigned cnum) return NULL; } +/**************************************************************************** + Find a conn given a service name. +****************************************************************************/ + +connection_struct *conn_find_byname(const char *service) +{ + int count=0; + connection_struct *conn; + + for (conn=Connections;conn;conn=conn->next,count++) { + if (strequal(lp_servicename(SNUM(conn)),service)) { + if (count > 10) { + DLIST_PROMOTE(Connections, conn); + } + return conn; + } + } + + return NULL; +} + /**************************************************************************** find first available connection slot, starting from a random position. diff --git a/source3/smbd/msdfs.c b/source3/smbd/msdfs.c index e321a8c8e4..04b9b7deaa 100644 --- a/source3/smbd/msdfs.c +++ b/source3/smbd/msdfs.c @@ -49,6 +49,7 @@ static NTSTATUS parse_dfs_path(const char *pathname, { char *pathname_local; char *p,*temp; + char *servicename; char *eos_ptr; NTSTATUS status = NT_STATUS_OK; char sepchar; @@ -128,16 +129,49 @@ static NTSTATUS parse_dfs_path(const char *pathname, DEBUG(10,("parse_dfs_path: hostname: %s\n",pdp->hostname)); /* Parse out servicename. */ - temp = p+1; - p = strchr_m(temp,sepchar); + servicename = p+1; + p = strchr_m(servicename,sepchar); + if (p) { + *p = '\0'; + } + + /* Is this really our servicename ? */ + if (NULL == conn_find_byname(servicename)) { + DEBUG(10,("parse_dfs_path: %s is not our servicename\n", + servicename)); + + /* + * Possibly client sent a local path by mistake. + * Try and convert to a local path. + */ + + pdp->hostname = eos_ptr; /* "" */ + pdp->servicename = eos_ptr; /* "" */ + + /* Repair the path - replace the sepchar's + we nulled out */ + servicename--; + *servicename = sepchar; + if (p) { + *p = sepchar; + } + + p = temp; + DEBUG(10,("parse_dfs_path: trying to convert %s " + "to a local path\n", + temp)); + goto local_path; + } + + pdp->servicename = servicename; + + DEBUG(10,("parse_dfs_path: servicename: %s\n",pdp->servicename)); + if(p == NULL) { - pdp->servicename = temp; + /* Client sent self referral \server\share. */ pdp->reqpath = eos_ptr; /* "" */ return NT_STATUS_OK; } - *p = '\0'; - pdp->servicename = temp; - DEBUG(10,("parse_dfs_path: servicename: %s\n",pdp->servicename)); p++; |