smbd: Support multiple dfs targets for msdfs proxy shares
authorVolker Lendecke <vl@samba.org>
Wed, 30 Oct 2013 13:22:05 +0000 (13:22 +0000)
committerBjörn Jacke <bj@sernet.de>
Thu, 31 Oct 2013 10:54:48 +0000 (11:54 +0100)
Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Björn Jacke <bj@sernet.de>
source3/smbd/msdfs.c

index 52a2a4852e90d678712ffa15d76ad7f8b61496c8..aede3e6da0b677634568da31423164c481b04a8b 100644 (file)
@@ -958,6 +958,7 @@ NTSTATUS get_referred_path(TALLOC_CTX *ctx,
        if (pdp->reqpath[0] == '\0') {
                char *tmp;
                struct referral *ref;
+               int refcount;
 
                if (*lp_msdfs_proxy(talloc_tos(), snum) == '\0') {
                        TALLOC_FREE(pdp);
@@ -973,39 +974,20 @@ NTSTATUS get_referred_path(TALLOC_CTX *ctx,
                 * the configured target share.
                 */
 
-               jucn->referral_count = 1;
-               if ((ref = talloc_zero(ctx, struct referral)) == NULL) {
+               tmp = talloc_asprintf(talloc_tos(), "msdfs:%s",
+                                     lp_msdfs_proxy(talloc_tos(), snum));
+               if (tmp == NULL) {
                        TALLOC_FREE(pdp);
                        return NT_STATUS_NO_MEMORY;
                }
 
-               if (!(tmp = talloc_strdup(ctx, lp_msdfs_proxy(talloc_tos(), snum)))) {
+               if (!parse_msdfs_symlink(ctx, tmp, &ref, &refcount)) {
+                       TALLOC_FREE(tmp);
                        TALLOC_FREE(pdp);
-                       return NT_STATUS_NO_MEMORY;
+                       return NT_STATUS_INVALID_PARAMETER;
                }
-
-               trim_string(tmp, "\\", 0);
-
-               ref->alternate_path = talloc_asprintf(ctx, "\\%s", tmp);
                TALLOC_FREE(tmp);
-
-               if (!ref->alternate_path) {
-                       TALLOC_FREE(pdp);
-                       return NT_STATUS_NO_MEMORY;
-               }
-
-               if (pdp->reqpath[0] != '\0') {
-                       ref->alternate_path = talloc_asprintf_append(
-                                       ref->alternate_path,
-                                       "%s",
-                                       pdp->reqpath);
-                       if (!ref->alternate_path) {
-                               TALLOC_FREE(pdp);
-                               return NT_STATUS_NO_MEMORY;
-                       }
-               }
-               ref->proximity = 0;
-               ref->ttl = REFERRAL_TTL;
+               jucn->referral_count = refcount;
                jucn->referral_list = ref;
                *consumedcntp = strlen(dfs_path);
                TALLOC_FREE(pdp);