afs: Use talloc_stackframe() instead of talloc_init()
[samba.git] / source3 / lib / afs.c
index dadd83d513b679783b7e4725e29209ffe58bbad6..9f5d81f44280cf39a6027facb3a781e62c1568a0 100644 (file)
@@ -42,20 +42,23 @@ static char *afs_encode_token(const char *cell, const DATA_BLOB ticket,
                              const struct ClearToken *ct)
 {
        char *base64_ticket;
-       char *result;
+       char *result = NULL;
 
        DATA_BLOB key = data_blob(ct->HandShakeKey, 8);
        char *base64_key;
+       TALLOC_CTX *mem_ctx;
+
+       mem_ctx = talloc_stackframe();
+       if (mem_ctx == NULL)
+               goto done;
 
-       base64_ticket = base64_encode_data_blob(ticket);
+       base64_ticket = base64_encode_data_blob(mem_ctx, ticket);
        if (base64_ticket == NULL)
-               return NULL;
+               goto done;
 
-       base64_key = base64_encode_data_blob(key);
-       if (base64_key == NULL) {
-               TALLOC_FREE(base64_ticket);
-               return NULL;
-       }
+       base64_key = base64_encode_data_blob(mem_ctx, key);
+       if (base64_key == NULL)
+               goto done;
 
        asprintf(&result, "%s\n%u\n%s\n%u\n%u\n%u\n%s\n", cell,
                 ct->AuthHandle, base64_key, ct->ViceId, ct->BeginTimestamp,
@@ -63,8 +66,8 @@ static char *afs_encode_token(const char *cell, const DATA_BLOB ticket,
 
        DEBUG(10, ("Got ticket string:\n%s\n", result));
 
-       TALLOC_FREE(base64_ticket);
-       TALLOC_FREE(base64_key);
+done:
+       TALLOC_FREE(mem_ctx);
 
        return result;
 }
@@ -218,21 +221,31 @@ bool afs_login(connection_struct *conn)
        bool result;
        char *ticket_str = NULL;
        const DOM_SID *user_sid;
+       TALLOC_CTX *ctx = talloc_tos();
 
        struct ClearToken ct;
 
-       pstrcpy(afs_username, lp_afs_username_map());
-       standard_sub_advanced(SNUM(conn), conn->user,
-                             conn->connectpath, conn->gid,
-                             get_current_username(),
-                             current_user_info.domain,
-                             afs_username, sizeof(afs_username));
+       afs_username = talloc_strdup(ctx,
+                               lp_afs_username_map());
+       if (!afs_username) {
+               return false;
+       }
+
+       afs_username = talloc_sub_advanced(ctx,
+                               SNUM(conn), conn->user,
+                               conn->connectpath, conn->gid,
+                               get_current_username(),
+                               current_user_info.domain,
+                               afs_username);
+       if (!afs_username) {
+               return false;
+       }
 
        user_sid = &current_user.nt_user_token->user_sids[0];
        afs_username = talloc_string_sub(talloc_tos(),
-                                       lp_afs_username_map(),
+                                       afs_username,
                                        "%s",
-                                       sid_string_static(user_sid));
+                                       sid_string_tos(user_sid));
        if (!afs_username) {
                return false;
        }