diff options
author | Jeremy Allison <jra@samba.org> | 2008-05-13 15:02:11 -0700 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2008-05-13 15:02:11 -0700 |
commit | b833615721d6d2e328908afeb1cb965ab5d38284 (patch) | |
tree | 4f32f33e8edf43f2ac8b27616e6c4099e7e2da35 /source3 | |
parent | bafe8d22fde97755bf35e8abf389d52b8993a551 (diff) | |
download | samba-b833615721d6d2e328908afeb1cb965ab5d38284.tar.gz samba-b833615721d6d2e328908afeb1cb965ab5d38284.tar.bz2 samba-b833615721d6d2e328908afeb1cb965ab5d38284.zip |
Second part of patch for bug #5460. Cope with pathnames
that don't look like \xxx\yyy, cope with arbitrary length.
Jeremy.
(This used to be commit 635035d999fcd8e06b70c8cb1137127c289dc9e6)
Diffstat (limited to 'source3')
-rw-r--r-- | source3/smbd/msdfs.c | 54 |
1 files changed, 39 insertions, 15 deletions
diff --git a/source3/smbd/msdfs.c b/source3/smbd/msdfs.c index 6306745574..4e673d8000 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,25 +129,48 @@ 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; + if(p == NULL) { - pdp->servicename = temp; + /* Client sent self referral \server\share. */ pdp->reqpath = eos_ptr; /* "" */ - /* Is this really our servicename ? */ - if (NULL == conn_find_byname(pdp->servicename)) { - DEBUG(10,("parse_dfs_path: %s is not our servicename\n", - pdp->servicename)); - p = temp; - DEBUG(10,("parse_dfs_path: trying to convert %s " - "to a local path\n", - temp)); - goto local_path; - } return NT_STATUS_OK; } - *p = '\0'; - pdp->servicename = temp; + DEBUG(10,("parse_dfs_path: servicename: %s\n",pdp->servicename)); p++; |