s4-dfs: Use a workaround for ndr relative pointer bug/limitation
authorMatthieu Patou <mat@matws.net>
Mon, 16 May 2011 16:51:20 +0000 (20:51 +0400)
committerMatthieu Patou <mat@samba.org>
Mon, 16 May 2011 23:33:27 +0000 (01:33 +0200)
Autobuild-User: Matthieu Patou <mat@samba.org>
Autobuild-Date: Tue May 17 01:33:27 CEST 2011 on sn-devel-104

source4/smb_server/smb/trans2.c

index 058777967712b8ab440a58f60da3adbec4157dd7..163712379a97b85d11f7ad841666e474ac91470d 100644 (file)
@@ -867,24 +867,22 @@ static NTSTATUS fill_normal_dfs_referraltype(struct dfs_referral_type *ref,
                                             const char *dfs_path,
                                             const char *server_path, int isfirstoffset)
 {
+       ZERO_STRUCTP(ref);
+       ref->version = version;
 
        switch (version) {
        case 3:
-               ZERO_STRUCTP(ref);
-               ref->version = version;
                ref->referral.v3.server_type = DFS_SERVER_NON_ROOT;
                /* "normal" referral seems to always include the GUID */
                ref->referral.v3.size = 34;
 
                ref->referral.v3.entry_flags = 0;
                ref->referral.v3.ttl = 600; /* As w2k3 */
-               ref->referral.v3.referrals.r1.DFS_path = dfs_path;
-               ref->referral.v3.referrals.r1.DFS_alt_path = dfs_path;
-               ref->referral.v3.referrals.r1.netw_address = server_path;
+               ref->referral.v3.referrals.r1.DFS_path = talloc_strdup(ref, dfs_path);
+               ref->referral.v3.referrals.r1.DFS_alt_path = talloc_strdup(ref, dfs_path);
+               ref->referral.v3.referrals.r1.netw_address = talloc_strdup(ref, server_path);
                return NT_STATUS_OK;
        case 4:
-               ZERO_STRUCTP(ref);
-               ref->version = version;
                ref->referral.v4.server_type = DFS_SERVER_NON_ROOT;
                /* "normal" referral seems to always include the GUID */
                ref->referral.v4.size = 34;
@@ -893,10 +891,9 @@ static NTSTATUS fill_normal_dfs_referraltype(struct dfs_referral_type *ref,
                        ref->referral.v4.entry_flags =  DFS_HEADER_FLAG_TARGET_BCK;
                }
                ref->referral.v4.ttl = 900; /* As w2k8r2 */
-               ref->referral.v4.referrals.r1.DFS_path = dfs_path;
-               ref->referral.v4.referrals.r1.DFS_alt_path = dfs_path;
-               ref->referral.v4.referrals.r1.netw_address = server_path;
-
+               ref->referral.v4.referrals.r1.DFS_path = talloc_strdup(ref, dfs_path);
+               ref->referral.v4.referrals.r1.DFS_alt_path = talloc_strdup(ref, dfs_path);
+               ref->referral.v4.referrals.r1.netw_address = talloc_strdup(ref, server_path);
                return NT_STATUS_OK;
        }
        return NT_STATUS_INVALID_LEVEL;