s3-auth: Finally change make_user_info_*() use a parent talloc context
authorAndrew Bartlett <abartlet@samba.org>
Wed, 26 Mar 2014 20:17:15 +0000 (09:17 +1300)
committerDavid Disseldorp <ddiss@samba.org>
Wed, 2 Apr 2014 09:05:46 +0000 (11:05 +0200)
Change-Id: Iedf516e8c24e0d18064aeedd8e287ed692d3c5b4
Signed-off-by: Andrew Bartlett <abartlet@samba.org>
Reviewed-by: David Disseldorp <ddiss@samba.org>
source3/auth/auth_ntlmssp.c
source3/auth/auth_util.c
source3/auth/proto.h
source3/auth/user_info.c
source3/rpc_server/netlogon/srv_netlog_nt.c
source3/smbd/sesssetup.c
source3/torture/pdbtest.c
source3/winbindd/winbindd_pam.c

index d4fe901f7ccee0dfd4a483ae6bc3532cfb6a22e2..45166c094b5a1e7c61daac87cb499eb8247f73b0 100644 (file)
@@ -116,7 +116,8 @@ NTSTATUS auth3_check_password(struct auth4_context *auth4_context,
 
        lp_load(get_dyn_CONFIGFILE(), false, false, true, true);
 
-       nt_status = make_user_info_map(&mapped_user_info,
+       nt_status = make_user_info_map(talloc_tos(),
+                                       &mapped_user_info,
                                       user_info->client.account_name,
                                       user_info->client.domain_name,
                                       user_info->workstation_name,
@@ -148,7 +149,7 @@ NTSTATUS auth3_check_password(struct auth4_context *auth4_context,
 
        username_was_mapped = mapped_user_info->was_mapped;
 
-       free_user_info(&mapped_user_info);
+       TALLOC_FREE(mapped_user_info);
 
        if (!NT_STATUS_IS_OK(nt_status)) {
                nt_status = do_map_to_guest_server_info(mem_ctx,
index fb9e8c8258a44faafb404caddf400989b1dcf6e8..cab77b405153ba72ee3606c078c68991722eeff3 100644 (file)
@@ -89,7 +89,8 @@ static int _smb_create_user(const char *domain, const char *unix_username, const
  Create an auth_usersupplied_data structure after appropriate mapping.
 ****************************************************************************/
 
-NTSTATUS make_user_info_map(struct auth_usersupplied_info **user_info,
+NTSTATUS make_user_info_map(TALLOC_CTX *mem_ctx,
+                           struct auth_usersupplied_info **user_info,
                            const char *smb_name,
                            const char *client_domain,
                            const char *workstation_name,
@@ -141,7 +142,7 @@ NTSTATUS make_user_info_map(struct auth_usersupplied_info **user_info,
         * it is our global SAM name, or for legacy behavior it is our
         * primary domain name */
 
-       result = make_user_info(user_info, smb_name, internal_username,
+       result = make_user_info(mem_ctx, user_info, smb_name, internal_username,
                              client_domain, domain, workstation_name,
                              remote_address, lm_pwd, nt_pwd,
                              lm_interactive_pwd, nt_interactive_pwd,
@@ -160,7 +161,8 @@ NTSTATUS make_user_info_map(struct auth_usersupplied_info **user_info,
  Decrypt and encrypt the passwords.
 ****************************************************************************/
 
-bool make_user_info_netlogon_network(struct auth_usersupplied_info **user_info,
+bool make_user_info_netlogon_network(TALLOC_CTX *mem_ctx,
+                                    struct auth_usersupplied_info **user_info,
                                     const char *smb_name, 
                                     const char *client_domain, 
                                     const char *workstation_name,
@@ -176,7 +178,7 @@ bool make_user_info_netlogon_network(struct auth_usersupplied_info **user_info,
        DATA_BLOB lm_blob = data_blob(lm_network_pwd, lm_pwd_len);
        DATA_BLOB nt_blob = data_blob(nt_network_pwd, nt_pwd_len);
 
-       status = make_user_info_map(user_info,
+       status = make_user_info_map(mem_ctx, user_info,
                                    smb_name, client_domain, 
                                    workstation_name,
                                    remote_address,
@@ -200,7 +202,8 @@ bool make_user_info_netlogon_network(struct auth_usersupplied_info **user_info,
  Decrypt and encrypt the passwords.
 ****************************************************************************/
 
-bool make_user_info_netlogon_interactive(struct auth_usersupplied_info **user_info,
+bool make_user_info_netlogon_interactive(TALLOC_CTX *mem_ctx,
+                                        struct auth_usersupplied_info **user_info,
                                         const char *smb_name, 
                                         const char *client_domain, 
                                         const char *workstation_name,
@@ -246,6 +249,7 @@ bool make_user_info_netlogon_interactive(struct auth_usersupplied_info **user_in
                }
 
                nt_status = make_user_info_map(
+                       mem_ctx,
                        user_info, 
                        smb_name, client_domain, workstation_name,
                        remote_address,
@@ -271,7 +275,8 @@ bool make_user_info_netlogon_interactive(struct auth_usersupplied_info **user_in
  Create an auth_usersupplied_data structure
 ****************************************************************************/
 
-bool make_user_info_for_reply(struct auth_usersupplied_info **user_info,
+bool make_user_info_for_reply(TALLOC_CTX *mem_ctx,
+                             struct auth_usersupplied_info **user_info,
                              const char *smb_name, 
                              const char *client_domain,
                              const struct tsocket_address *remote_address,
@@ -318,7 +323,7 @@ bool make_user_info_for_reply(struct auth_usersupplied_info **user_info,
                return false;
        }
 
-       ret = make_user_info(
+       ret = make_user_info(mem_ctx,
                user_info, smb_name, smb_name, client_domain, client_domain, 
                get_remote_machine_name(),
                remote_address,
@@ -341,13 +346,15 @@ bool make_user_info_for_reply(struct auth_usersupplied_info **user_info,
  Create an auth_usersupplied_data structure
 ****************************************************************************/
 
-NTSTATUS make_user_info_for_reply_enc(struct auth_usersupplied_info **user_info,
+NTSTATUS make_user_info_for_reply_enc(TALLOC_CTX *mem_ctx,
+                                     struct auth_usersupplied_info **user_info,
                                       const char *smb_name,
                                       const char *client_domain,
                                      const struct tsocket_address *remote_address,
                                       DATA_BLOB lm_resp, DATA_BLOB nt_resp)
 {
-       return make_user_info(user_info, smb_name, smb_name, 
+       return make_user_info(mem_ctx,
+                             user_info, smb_name, smb_name,
                              client_domain, client_domain, 
                              get_remote_machine_name(),
                              remote_address,
@@ -361,12 +368,14 @@ NTSTATUS make_user_info_for_reply_enc(struct auth_usersupplied_info **user_info,
  Create a guest user_info blob, for anonymous authentication.
 ****************************************************************************/
 
-bool make_user_info_guest(const struct tsocket_address *remote_address,
+bool make_user_info_guest(TALLOC_CTX *mem_ctx,
+                         const struct tsocket_address *remote_address,
                          struct auth_usersupplied_info **user_info)
 {
        NTSTATUS nt_status;
 
-       nt_status = make_user_info(user_info, 
+       nt_status = make_user_info(mem_ctx,
+                                  user_info,
                                   "","", 
                                   "","", 
                                   "", 
index 7b8959f035fce1fd61c4dcbd82f49a96897cfc54..6ce3aa79d219e0d6eaea8d689940b4c5bc54569c 100644 (file)
@@ -147,7 +147,8 @@ NTSTATUS auth_unix_init(void);
 /* The following definitions come from auth/auth_util.c  */
 struct tsocket_address;
 
-NTSTATUS make_user_info_map(struct auth_usersupplied_info **user_info,
+NTSTATUS make_user_info_map(TALLOC_CTX *mem_ctx,
+                           struct auth_usersupplied_info **user_info,
                            const char *smb_name,
                            const char *client_domain,
                            const char *workstation_name,
@@ -158,7 +159,8 @@ NTSTATUS make_user_info_map(struct auth_usersupplied_info **user_info,
                            const struct samr_Password *nt_interactive_pwd,
                            const char *plaintext,
                            enum auth_password_state password_state);
-bool make_user_info_netlogon_network(struct auth_usersupplied_info **user_info,
+bool make_user_info_netlogon_network(TALLOC_CTX *mem_ctx,
+                                    struct auth_usersupplied_info **user_info,
                                     const char *smb_name,
                                     const char *client_domain,
                                     const char *workstation_name,
@@ -168,7 +170,8 @@ bool make_user_info_netlogon_network(struct auth_usersupplied_info **user_info,
                                     int lm_pwd_len,
                                     const uchar *nt_network_pwd,
                                     int nt_pwd_len);
-bool make_user_info_netlogon_interactive(struct auth_usersupplied_info **user_info,
+bool make_user_info_netlogon_interactive(TALLOC_CTX *mem_ctx,
+                                        struct auth_usersupplied_info **user_info,
                                         const char *smb_name,
                                         const char *client_domain,
                                         const char *workstation_name,
@@ -177,18 +180,21 @@ bool make_user_info_netlogon_interactive(struct auth_usersupplied_info **user_in
                                         const uchar chal[8],
                                         const uchar lm_interactive_pwd[16],
                                         const uchar nt_interactive_pwd[16]);
-bool make_user_info_for_reply(struct auth_usersupplied_info **user_info,
+bool make_user_info_for_reply(TALLOC_CTX *mem_ctx,
+                             struct auth_usersupplied_info **user_info,
                              const char *smb_name,
                              const char *client_domain,
                              const struct tsocket_address *remote_address,
                              const uint8 chal[8],
                              DATA_BLOB plaintext_password);
-NTSTATUS make_user_info_for_reply_enc(struct auth_usersupplied_info **user_info,
+NTSTATUS make_user_info_for_reply_enc(TALLOC_CTX *mem_ctx,
+                                     struct auth_usersupplied_info **user_info,
                                       const char *smb_name,
                                       const char *client_domain,
                                      const struct tsocket_address *remote_address,
                                       DATA_BLOB lm_resp, DATA_BLOB nt_resp);
-bool make_user_info_guest(const struct tsocket_address *remote_address,
+bool make_user_info_guest(TALLOC_CTX *mem_ctx,
+                         const struct tsocket_address *remote_address,
                          struct auth_usersupplied_info **user_info);
 
 struct samu;
@@ -249,7 +255,8 @@ NTSTATUS session_extract_session_key(const struct auth_session_info *session_inf
 
 /* The following definitions come from auth/user_info.c  */
 
-NTSTATUS make_user_info(struct auth_usersupplied_info **ret_user_info,
+NTSTATUS make_user_info(TALLOC_CTX *mem_ctx,
+                       struct auth_usersupplied_info **ret_user_info,
                        const char *smb_name,
                        const char *internal_username,
                        const char *client_domain,
index 61367f959bb8d994c9eb0556b777e6e3b914caec..0d5176d2b1f1ea87b316efa99f89a399e4b1451d 100644 (file)
@@ -41,7 +41,8 @@ static int clear_string(char *password)
  Create an auth_usersupplied_data structure
 ****************************************************************************/
 
-NTSTATUS make_user_info(struct auth_usersupplied_info **ret_user_info,
+NTSTATUS make_user_info(TALLOC_CTX *mem_ctx,
+                       struct auth_usersupplied_info **ret_user_info,
                        const char *smb_name,
                        const char *internal_username,
                        const char *client_domain,
@@ -60,10 +61,7 @@ NTSTATUS make_user_info(struct auth_usersupplied_info **ret_user_info,
 
        DEBUG(5,("attempting to make a user_info for %s (%s)\n", internal_username, smb_name));
 
-       /* FIXME: Have the caller provide a talloc context of the
-        * correct lifetime (possibly talloc_tos(), but it depends on
-        * the caller) */
-       user_info = talloc_zero(NULL, struct auth_usersupplied_info);
+       user_info = talloc_zero(mem_ctx, struct auth_usersupplied_info);
        if (user_info == NULL) {
                DEBUG(0,("talloc failed for user_info\n"));
                return NT_STATUS_NO_MEMORY;
@@ -162,12 +160,3 @@ NTSTATUS make_user_info(struct auth_usersupplied_info **ret_user_info,
        *ret_user_info = user_info;
        return NT_STATUS_OK;
 }
-
-/***************************************************************************
- Free a user_info struct
-***************************************************************************/
-
-void free_user_info(struct auth_usersupplied_info **user_info)
-{
-       TALLOC_FREE(*user_info);
-}
index f600f7403eba1aefa0a80800b5bacc99863c5f25..de30106e9a80ee88eaf78b1ef99f02571ed9ddfe 100644 (file)
@@ -1578,7 +1578,8 @@ static NTSTATUS _netr_LogonSamLogon_base(struct pipes_struct *p,
                if (*wksname == '\\') wksname++;
 
                /* Standard challenge/response authentication */
-               if (!make_user_info_netlogon_network(&user_info,
+               if (!make_user_info_netlogon_network(talloc_tos(),
+                                                    &user_info,
                                                     nt_username, nt_domain,
                                                     wksname,
                                                     p->remote_address,
@@ -1628,7 +1629,8 @@ static NTSTATUS _netr_LogonSamLogon_base(struct pipes_struct *p,
 
                auth_get_ntlm_challenge(auth_context, chal);
 
-               if (!make_user_info_netlogon_interactive(&user_info,
+               if (!make_user_info_netlogon_interactive(talloc_tos(),
+                                                        &user_info,
                                                         nt_username, nt_domain,
                                                         nt_workstation,
                                                         p->remote_address,
@@ -1653,7 +1655,7 @@ static NTSTATUS _netr_LogonSamLogon_base(struct pipes_struct *p,
        }
 
        TALLOC_FREE(auth_context);
-       free_user_info(&user_info);
+       TALLOC_FREE(user_info);
 
        DEBUG(5,("%s: check_password returned status %s\n",
                  fn, nt_errstr(status)));
index f719ec5233578d30d113df982f1873c3b6a59e21..1a0cb5e29d53104b91d390aad0d5ef00d43a77ec 100644 (file)
@@ -100,14 +100,14 @@ static NTSTATUS check_guest_password(const struct tsocket_address *remote_addres
        auth_context->get_ntlm_challenge(auth_context,
                                         chal);
 
-       if (!make_user_info_guest(remote_address, &user_info)) {
+       if (!make_user_info_guest(talloc_tos(), remote_address, &user_info)) {
                TALLOC_FREE(auth_context);
                return NT_STATUS_NO_MEMORY;
        }
 
        nt_status = auth_check_password_session_info(auth_context, 
                                                     mem_ctx, user_info, session_info);
-       free_user_info(&user_info);
+       TALLOC_FREE(user_info);
        TALLOC_FREE(auth_context);
        return nt_status;
 }
@@ -874,10 +874,11 @@ void reply_sesssetup_and_X(struct smb_request *req)
                        END_PROFILE(SMBsesssetupX);
                        return;
                }
-               nt_status = make_user_info_for_reply_enc(&user_info, user,
-                                               domain,
-                                               sconn->remote_address,
-                                               lm_resp, nt_resp);
+               nt_status = make_user_info_for_reply_enc(talloc_tos(),
+                                                        &user_info, user,
+                                                        domain,
+                                                        sconn->remote_address,
+                                                        lm_resp, nt_resp);
                if (NT_STATUS_IS_OK(nt_status)) {
                        nt_status = auth_check_password_session_info(negprot_auth_context, 
                                                                     req, user_info, &session_info);
@@ -894,7 +895,8 @@ void reply_sesssetup_and_X(struct smb_request *req)
                        plaintext_auth_context->get_ntlm_challenge(
                                        plaintext_auth_context, chal);
 
-                       if (!make_user_info_for_reply(&user_info,
+                       if (!make_user_info_for_reply(talloc_tos(),
+                                                     &user_info,
                                                      user, domain,
                                                      sconn->remote_address,
                                                      chal,
@@ -910,7 +912,7 @@ void reply_sesssetup_and_X(struct smb_request *req)
                }
        }
 
-       free_user_info(&user_info);
+       TALLOC_FREE(user_info);
 
        if (!NT_STATUS_IS_OK(nt_status)) {
                data_blob_free(&nt_resp);
index d391e961095402f18a4f887235398a16420026d1..feadcf94120899081e9ed7d3e3fd98a591a08fd7 100644 (file)
@@ -277,7 +277,8 @@ static bool test_auth(TALLOC_CTX *mem_ctx, struct samu *pdb_entry)
                return False;
        }
        
-       status = make_user_info(&user_info, pdb_get_username(pdb_entry), pdb_get_username(pdb_entry), 
+       status = make_user_info(mem_ctx,
+                               &user_info, pdb_get_username(pdb_entry), pdb_get_username(pdb_entry),
                                pdb_get_domain(pdb_entry), pdb_get_domain(pdb_entry), lp_netbios_name(), 
                                tsocket_address, NULL, &nt_resp, NULL, NULL, NULL, 
                                AUTH_PASSWORD_RESPONSE);
index b41291e37512e1aaeb8206757a991a780c91a97f..415dc79974c90f7818ca7a026d30414ae824da49 100644 (file)
@@ -1215,6 +1215,7 @@ static NTSTATUS winbindd_dual_auth_passdb(TALLOC_CTX *mem_ctx,
        struct tsocket_address *local;
        NTSTATUS status;
        int rc;
+       TALLOC_CTX *frame = talloc_stackframe();
 
        rc = tsocket_address_inet_from_strings(mem_ctx,
                                               "ip",
@@ -1222,13 +1223,15 @@ static NTSTATUS winbindd_dual_auth_passdb(TALLOC_CTX *mem_ctx,
                                               0,
                                               &local);
        if (rc < 0) {
+               TALLOC_FREE(frame);
                return NT_STATUS_NO_MEMORY;
        }
-       status = make_user_info(&user_info, user, user, domain, domain,
+       status = make_user_info(frame, &user_info, user, user, domain, domain,
                                lp_netbios_name(), local, lm_resp, nt_resp, NULL, NULL,
                                NULL, AUTH_PASSWORD_RESPONSE);
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(10, ("make_user_info failed: %s\n", nt_errstr(status)));
+               TALLOC_FREE(frame);
                return status;
        }
        user_info->logon_parameters = logon_parameters;
@@ -1236,11 +1239,11 @@ static NTSTATUS winbindd_dual_auth_passdb(TALLOC_CTX *mem_ctx,
        /* We don't want any more mapping of the username */
        user_info->mapped_state = True;
 
-       status = check_sam_security_info3(challenge, talloc_tos(), user_info,
+       status = check_sam_security_info3(challenge, mem_ctx, user_info,
                                          pinfo3);
-       free_user_info(&user_info);
        DEBUG(10, ("Authenticaticating user %s\\%s returned %s\n", domain,
                   user, nt_errstr(status)));
+       TALLOC_FREE(frame);
        return status;
 }