summaryrefslogtreecommitdiff
path: root/source3/smbd/msdfs.c
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2008-05-13 15:02:11 -0700
committerJeremy Allison <jra@samba.org>2008-05-13 15:02:11 -0700
commitb833615721d6d2e328908afeb1cb965ab5d38284 (patch)
tree4f32f33e8edf43f2ac8b27616e6c4099e7e2da35 /source3/smbd/msdfs.c
parentbafe8d22fde97755bf35e8abf389d52b8993a551 (diff)
downloadsamba-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/smbd/msdfs.c')
-rw-r--r--source3/smbd/msdfs.c54
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++;