]> git.samba.org - samba.git/commitdiff
Remove next_token - all uses must now be next_token_talloc.
authorJeremy Allison <jra@samba.org>
Sat, 8 Dec 2007 01:32:32 +0000 (17:32 -0800)
committerJeremy Allison <jra@samba.org>
Sat, 8 Dec 2007 01:32:32 +0000 (17:32 -0800)
No more temptations to use static length strings.
Jeremy.
(This used to be commit ec003f39369910dee852b7cafb883ddaa321c2de)

29 files changed:
source3/auth/auth_sam.c
source3/auth/auth_server.c
source3/auth/pampass.c
source3/groupdb/mapping_ldb.c
source3/groupdb/mapping_tdb.c
source3/lib/sharesec.c
source3/lib/util_sock.c
source3/lib/util_str.c
source3/libgpo/gpo_fetch.c
source3/libsmb/clikrb5.c
source3/libsmb/libsmbclient.c
source3/libsmb/namequery.c
source3/nmbd/nmbd_sendannounce.c
source3/nmbd/nmbd_synclists.c
source3/nmbd/nmbd_winsserver.c
source3/nsswitch/wbinfo.c
source3/nsswitch/winbind_nss_linux.c
source3/passdb/pdb_ldap.c
source3/printing/lpq_parse.c
source3/registry/reg_db.c
source3/rpc_parse/parse_net.c
source3/smbd/chgpasswd.c
source3/smbd/lanman.c
source3/smbd/server.c
source3/utils/net_rpc.c
source3/utils/net_rpc_printer.c
source3/utils/sharesec.c
source3/utils/smbcacls.c
source3/winbindd/winbindd_pam.c

index 13fc968b8851128646ceb3b5186fa8b432d42d47..1ab0c8b3eb5f52bfbf4047414f3d4164c3000b69 100644 (file)
@@ -188,15 +188,14 @@ static NTSTATUS sam_account_ok(TALLOC_CTX *mem_ctx,
 
        if (*workstation_list) {
                bool invalid_ws = True;
-               fstring tok;
+               char *tok;
                const char *s = workstation_list;
 
                const char *machine_name = talloc_asprintf(mem_ctx, "%s$", user_info->wksta_name);
                if (machine_name == NULL)
                        return NT_STATUS_NO_MEMORY;
-                       
-                       
-               while (next_token(&s, tok, ",", sizeof(tok))) {
+
+               while (next_token_talloc(mem_ctx, &s, &tok, ",")) {
                        DEBUG(10,("sam_account_ok: checking for workstation match %s and %s\n",
                                  tok, user_info->wksta_name));
                        if(strequal(tok, user_info->wksta_name)) {
@@ -211,9 +210,11 @@ static NTSTATUS sam_account_ok(TALLOC_CTX *mem_ctx,
                                        break;
                                }
                        }
+                       TALLOC_FREE(tok);
                }
-               
-               if (invalid_ws) 
+               TALLOC_FREE(tok);
+
+               if (invalid_ws)
                        return NT_STATUS_INVALID_WORKSTATION;
        }
 
@@ -221,7 +222,7 @@ static NTSTATUS sam_account_ok(TALLOC_CTX *mem_ctx,
                DEBUG(2,("sam_account_ok: Domain trust account %s denied by server\n", pdb_get_username(sampass)));
                return NT_STATUS_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT;
        }
-       
+
        if (acct_ctrl & ACB_SVRTRUST) {
                if (!(user_info->logon_parameters & MSV1_0_ALLOW_SERVER_TRUST_ACCOUNT)) {
                        DEBUG(2,("sam_account_ok: Server trust account %s denied by server\n", pdb_get_username(sampass)));
index 8b10be93fcae94e544cc481dc8059ba7b4ef51d5..7c99848612775013f3783975e6b77a65b9784ac5 100644 (file)
@@ -32,10 +32,10 @@ extern userdom_struct current_user_info;
 static struct cli_state *server_cryptkey(TALLOC_CTX *mem_ctx)
 {
        struct cli_state *cli = NULL;
-       fstring desthost;
+       char *desthost = NULL;
        struct sockaddr_storage dest_ss;
        const char *p;
-       char *pserver;
+       char *pserver = NULL;
        bool connected_ok = False;
 
        if (!(cli = cli_initialise()))
@@ -47,11 +47,16 @@ static struct cli_state *server_cryptkey(TALLOC_CTX *mem_ctx)
         pserver = talloc_strdup(mem_ctx, lp_passwordserver());
        p = pserver;
 
-        while(next_token( &p, desthost, LIST_SEP, sizeof(desthost))) {
+        while(next_token_talloc(mem_ctx, &p, &desthost, LIST_SEP)) {
                NTSTATUS status;
 
-               standard_sub_basic(current_user_info.smb_name, current_user_info.domain,
-                                  desthost, sizeof(desthost));
+               desthost = talloc_sub_basic(mem_ctx,
+                               current_user_info.smb_name,
+                               current_user_info.domain,
+                               desthost);
+               if (!desthost) {
+                       return NULL;
+               }
                strupper_m(desthost);
 
                if(!resolve_name( desthost, &dest_ss, 0x20)) {
@@ -64,9 +69,9 @@ static struct cli_state *server_cryptkey(TALLOC_CTX *mem_ctx)
                        continue;
                }
 
-               /* we use a mutex to prevent two connections at once - when a 
-                  Win2k PDC get two connections where one hasn't completed a 
-                  session setup yet it will send a TCP reset to the first 
+               /* we use a mutex to prevent two connections at once - when a
+                  Win2k PDC get two connections where one hasn't completed a
+                  session setup yet it will send a TCP reset to the first
                   connection (tridge) */
 
                if (!grab_server_mutex(desthost)) {
@@ -81,27 +86,27 @@ static struct cli_state *server_cryptkey(TALLOC_CTX *mem_ctx)
                }
                DEBUG(10,("server_cryptkey: failed to connect to server %s. Error %s\n",
                        desthost, nt_errstr(status) ));
+               release_server_mutex();
        }
 
        if (!connected_ok) {
-               release_server_mutex();
                DEBUG(0,("password server not available\n"));
                cli_shutdown(cli);
                return NULL;
        }
-       
-       if (!attempt_netbios_session_request(&cli, global_myname(), 
+
+       if (!attempt_netbios_session_request(&cli, global_myname(),
                                             desthost, &dest_ss)) {
                release_server_mutex();
                DEBUG(1,("password server fails session request\n"));
                cli_shutdown(cli);
                return NULL;
        }
-       
+
        if (strequal(desthost,myhostname())) {
                exit_server_cleanly("Password server loop!");
        }
-       
+
        DEBUG(3,("got session\n"));
 
        if (!cli_negprot(cli)) {
@@ -119,9 +124,9 @@ static struct cli_state *server_cryptkey(TALLOC_CTX *mem_ctx)
                return NULL;
        }
 
-       /* Get the first session setup done quickly, to avoid silly 
+       /* Get the first session setup done quickly, to avoid silly
           Win2k bugs.  (The next connection to the server will kill
-          this one... 
+          this one...
        */
 
        if (!NT_STATUS_IS_OK(cli_session_setup(cli, "", "", 0, "", 0,
@@ -132,11 +137,11 @@ static struct cli_state *server_cryptkey(TALLOC_CTX *mem_ctx)
                cli_shutdown(cli);
                return NULL;
        }
-       
+
        release_server_mutex();
 
        DEBUG(3,("password server OK\n"));
-       
+
        return cli;
 }
 
index 739e0a78fdf6c528ddcb1dd500211f955a113a90..554df3c157c8c2d1bf1299b4c34e449442fbe2c7 100644 (file)
@@ -207,15 +207,17 @@ struct chat_struct {
 
 static struct chat_struct *make_pw_chat(const char *p) 
 {
-       fstring prompt;
-       fstring reply;
+       char *prompt;
+       char *reply;
        struct chat_struct *list = NULL;
        struct chat_struct *t;
+       TALLOC_CTX *frame = talloc_stackframe();
 
        while (1) {
                t = SMB_MALLOC_P(struct chat_struct);
                if (!t) {
                        DEBUG(0,("make_pw_chat: malloc failed!\n"));
+                       TALLOC_FREE(frame);
                        return NULL;
                }
 
@@ -223,22 +225,26 @@ static struct chat_struct *make_pw_chat(const char *p)
 
                DLIST_ADD_END(list, t, struct chat_struct*);
 
-               if (!next_token(&p, prompt, NULL, sizeof(fstring)))
+               if (!next_token_talloc(frame, &p, &prompt, NULL)) {
                        break;
+               }
 
-               if (strequal(prompt,"."))
+               if (strequal(prompt,".")) {
                        fstrcpy(prompt,"*");
+               }
 
                special_char_sub(prompt);
                fstrcpy(t->prompt, prompt);
                strlower_m(t->prompt);
                trim_char(t->prompt, ' ', ' ');
 
-               if (!next_token(&p, reply, NULL, sizeof(fstring)))
+               if (!next_token_talloc(frame, &p, reply, NULL)) {
                        break;
+               }
 
-               if (strequal(reply,"."))
-                               fstrcpy(reply,"");
+               if (strequal(reply,".")) {
+                       fstrcpy(reply,"");
+               }
 
                special_char_sub(reply);
                fstrcpy(t->reply, reply);
@@ -246,6 +252,7 @@ static struct chat_struct *make_pw_chat(const char *p)
                trim_char(t->reply, ' ', ' ');
 
        }
+       TALLOC_FREE(frame);
        return list;
 }
 
index ab7ac0b913383934540d785ad5d013f43a12533b..205111e5ac4b409aa7e8c31923e23c619ef132aa 100644 (file)
@@ -578,8 +578,9 @@ static int upgrade_alias_record(TDB_CONTEXT *tdb_ctx, TDB_DATA key,
                                TDB_DATA data, void *state)
 {
        const char *p = (const char *)data.dptr;
-       fstring string_sid;
+       char *string_sid;
        DOM_SID member;
+       TALLOC_CTX *frame;
 
        if (strncmp((char *)key.dptr, MEMBEROF_PREFIX, 
                    MIN(key.dsize, strlen(MEMBEROF_PREFIX))) != 0) {
@@ -592,7 +593,8 @@ static int upgrade_alias_record(TDB_CONTEXT *tdb_ctx, TDB_DATA key,
                *(int *)state = -1;
        }
 
-       while (next_token(&p, string_sid, " ", sizeof(string_sid))) {
+       frame = talloc_stackframe();
+       while (next_token_talloc(frame,&p, &string_sid, " ")) {
                DOM_SID alias;
                NTSTATUS status;
                string_to_sid(&alias, string_sid);
@@ -604,10 +606,11 @@ static int upgrade_alias_record(TDB_CONTEXT *tdb_ctx, TDB_DATA key,
                        DEBUG(0,("Failed to add alias member during upgrade - %s\n",
                                 nt_errstr(status)));
                        *(int *)state = -1;
+                       TALLOC_FREE(frame);
                        return -1;
                }
        }
-
+       TALLOC_FREE(frame);
        return 0;
 }
 
index 539b02e54b2f0d6074f9418a3b7ce904fe28302f..2e4ed4623ed91b14b713ecf9e641fb381a57325e 100644 (file)
@@ -388,9 +388,11 @@ static bool enum_group_mapping(const DOM_SID *domsid, enum lsa_SidType sid_name_
 static NTSTATUS one_alias_membership(const DOM_SID *member,
                               DOM_SID **sids, size_t *num)
 {
-       fstring key, string_sid;
+       fstring key;
+       char *string_sid;
        TDB_DATA dbuf;
        const char *p;
+       TALLOC_CTX *frame;
 
        sid_to_string(string_sid, member);
        slprintf(key, sizeof(key), "%s%s", MEMBEROF_PREFIX, string_sid);
@@ -402,19 +404,20 @@ static NTSTATUS one_alias_membership(const DOM_SID *member,
        }
 
        p = (const char *)dbuf.dptr;
-
-       while (next_token(&p, string_sid, " ", sizeof(string_sid))) {
-
+       frame = talloc_stackframe();
+       while (next_token_talloc(frame, &p, &string_sid, " ")) {
                DOM_SID alias;
 
                if (!string_to_sid(&alias, string_sid))
                        continue;
 
                if (!add_sid_to_array_unique(NULL, &alias, sids, num)) {
+                       TALLOC_FREE(frame);
                        return NT_STATUS_NO_MEMORY;
                }
        }
 
+       TALLOC_FREE(frame);
        SAFE_FREE(dbuf.dptr);
        return NT_STATUS_OK;
 }
@@ -518,7 +521,8 @@ static int collect_aliasmem(TDB_CONTEXT *tdb_ctx, TDB_DATA key, TDB_DATA data,
 {
        struct aliasmem_closure *closure = (struct aliasmem_closure *)state;
        const char *p;
-       fstring alias_string;
+       char *alias_string;
+       TALLOC_CTX *frame;
 
        if (strncmp((const char *)key.dptr, MEMBEROF_PREFIX,
                    strlen(MEMBEROF_PREFIX)) != 0)
@@ -526,11 +530,10 @@ static int collect_aliasmem(TDB_CONTEXT *tdb_ctx, TDB_DATA key, TDB_DATA data,
 
        p = (const char *)data.dptr;
 
-       while (next_token(&p, alias_string, " ", sizeof(alias_string))) {
-
+       frame = talloc_stackframe();
+       while (next_token_talloc(frame, &p, &alias_string, " ")) {
                DOM_SID alias, member;
                const char *member_string;
-               
 
                if (!string_to_sid(&alias, alias_string))
                        continue;
@@ -552,13 +555,14 @@ static int collect_aliasmem(TDB_CONTEXT *tdb_ctx, TDB_DATA key, TDB_DATA data,
 
                if (!string_to_sid(&member, member_string))
                        continue;
-               
+
                if (!add_sid_to_array(NULL, &member, closure->sids, closure->num)) {
                        /* talloc fail. */
                        break;
                }
        }
 
+       TALLOC_FREE(frame);
        return 0;
 }
 
index 4b1ec556c55889bbeee9d6a36a9b4747abc9ae48..b3b000579f1b9539320e932aa44e494f741292de 100644 (file)
@@ -290,10 +290,10 @@ bool parse_usershare_acl(TALLOC_CTX *ctx, const char *acl_str, SEC_DESC **ppsd)
                uint32 g_access;
                uint32 s_access;
                DOM_SID sid;
-               fstring sidstr;
+               char *sidstr;
                uint8 type = SEC_ACE_TYPE_ACCESS_ALLOWED;
 
-               if (!next_token(&pacl, sidstr, ":", sizeof(sidstr))) {
+               if (!next_token_talloc(ctx, &pacl, &sidstr, ":")) {
                        DEBUG(0,("parse_usershare_acl: malformed usershare acl looking "
                                "for ':' in string '%s'\n", pacl));
                        return False;
index e49db340ae0f2246d5a838221322ecc2060d8998..e919cc5a463f3e866ada88d2b1729f6f3388c6ee 100644 (file)
@@ -785,9 +785,10 @@ static void print_socket_options(int s)
 
 void set_socket_options(int fd, const char *options)
 {
-       fstring tok;
+       TALLOC_CTX *ctx = talloc_stackframe();
+       char *tok;
 
-       while (next_token(&options,tok," \t,", sizeof(tok))) {
+       while (next_token_talloc(ctx, &options, &tok," \t,")) {
                int ret=0,i;
                int value = 1;
                char *p;
@@ -836,6 +837,7 @@ void set_socket_options(int fd, const char *options)
                }
        }
 
+       TALLOC_FREE(ctx);
        print_socket_options(fd);
 }
 
index 2c0d86ec9a5dc18e2a806cf5ac0959d8953d6771..ee76e33de8830672b0ef85dd44a1ea8596358b77 100644 (file)
  * @brief String utilities.
  **/
 
-/**
- * Internal function to get the next token from a string, return false if none
- * found.  Handles double-quotes.  This is the work horse function called by
- * next_token() and next_token_no_ltrim().
- *
- * Based on a routine by GJC@VILLAGE.COM.
- * Extensively modified by Andrew.Tridgell@anu.edu.au
- */
-static bool next_token_internal(const char **ptr,
-                                char *buff,
-                                const char *sep,
-                                size_t bufsize,
-                                bool ltrim)
-{
-       char *s;
-       char *pbuf;
-       bool quoted;
-       size_t len=1;
-
-       if (!ptr)
-               return(false);
-
-       s = (char *)*ptr;
-
-       /* default to simple separators */
-       if (!sep)
-               sep = " \t\n\r";
-
-       /* find the first non sep char, if left-trimming is requested */
-       if (ltrim) {
-               while (*s && strchr_m(sep,*s))
-                       s++;
-       }
-
-       /* nothing left? */
-       if (! *s)
-               return(false);
-
-       /* copy over the token */
-       pbuf = buff;
-       for (quoted = false; len < bufsize && *s &&
-                       (quoted || !strchr_m(sep,*s)); s++) {
-               if ( *s == '\"' ) {
-                       quoted = !quoted;
-               } else {
-                       len++;
-                       *pbuf++ = *s;
-               }
-       }
-
-       *ptr = (*s) ? s+1 : s;
-       *pbuf = 0;
-
-       return(true);
-}
-
 static bool next_token_internal_talloc(TALLOC_CTX *ctx,
                                const char **ptr,
                                 char **pp_buff,
@@ -111,8 +55,9 @@ static bool next_token_internal_talloc(TALLOC_CTX *ctx,
 
        /* find the first non sep char, if left-trimming is requested */
        if (ltrim) {
-               while (*s && strchr_m(sep,*s))
+               while (*s && strchr_m(sep,*s)) {
                        s++;
+               }
        }
 
        /* nothing left? */
@@ -157,6 +102,7 @@ static bool next_token_internal_talloc(TALLOC_CTX *ctx,
        return true;
 }
 
+#if 0
 /*
  * Get the next token from a string, return false if none found.  Handles
  * double-quotes.  This version trims leading separator characters before
@@ -166,6 +112,7 @@ bool next_token(const char **ptr, char *buff, const char *sep, size_t bufsize)
 {
        return next_token_internal(ptr, buff, sep, bufsize, true);
 }
+#endif
 
 bool next_token_talloc(TALLOC_CTX *ctx,
                        const char **ptr,
@@ -180,13 +127,6 @@ bool next_token_talloc(TALLOC_CTX *ctx,
  * double-quotes.  This version does not trim leading separator characters
  * before looking for a token.
  */
-bool next_token_no_ltrim(const char **ptr,
-                         char *buff,
-                         const char *sep,
-                         size_t bufsize)
-{
-       return next_token_internal(ptr, buff, sep, bufsize, false);
-}
 
 bool next_token_no_ltrim_talloc(TALLOC_CTX *ctx,
                        const char **ptr,
@@ -204,18 +144,6 @@ but beware the fact that it is not re-entrant!
 
 static const char *last_ptr=NULL;
 
-bool next_token_nr(const char **ptr,char *buff, const char *sep, size_t bufsize)
-{
-       bool ret;
-       if (!ptr) {
-               ptr = &last_ptr;
-       }
-
-       ret = next_token(ptr, buff, sep, bufsize);
-       last_ptr = *ptr;
-       return ret;
-}
-
 bool next_token_nr_talloc(TALLOC_CTX *ctx,
                                const char **ptr,
                                char **pp_buff,
@@ -1097,23 +1025,16 @@ char *hex_encode(TALLOC_CTX *mem_ctx, const unsigned char *buff_in, size_t len)
 
 bool in_list(const char *s, const char *list, bool casesensitive)
 {
-       char *tok;
-       const char *p=list;
-       size_t bufsize = strlen(list);
+       char *tok = NULL;
        bool ret = false;
+       TALLOC_CTX *frame;
 
-       if (!list)
-               return(false);
-
-       /* We know a token can't be larger
-        * than the entire list. */
-
-       tok = SMB_MALLOC_ARRAY(char, bufsize+1);
-       if (!tok) {
+       if (!list) {
                return false;
        }
 
-       while (next_token(&p,tok,LIST_SEP,bufsize+1)) {
+       frame = talloc_stackframe();
+       while (next_token_talloc(frame, &list, &tok,LIST_SEP)) {
                if (casesensitive) {
                        if (strcmp(tok,s) == 0) {
                                ret = true;
@@ -1126,8 +1047,7 @@ bool in_list(const char *s, const char *list, bool casesensitive)
                        }
                }
        }
-
-       SAFE_FREE(tok);
+       TALLOC_FREE(frame);
        return ret;
 }
 
@@ -2409,7 +2329,8 @@ char *ipstr_list_make(char **ipstr_list,
 
 int ipstr_list_parse(const char *ipstr_list, struct ip_service **ip_list)
 {
-       fstring token_str;
+       TALLOC_CTX *frame;
+       char *token_str = NULL;
        size_t count;
        int i;
 
@@ -2423,8 +2344,9 @@ int ipstr_list_parse(const char *ipstr_list, struct ip_service **ip_list)
                return 0;
        }
 
-       for ( i=0; next_token(&ipstr_list, token_str,
-                               IPSTR_LIST_SEP, FSTRING_LEN) && i<count; i++ ) {
+       frame = talloc_stackframe();
+       for ( i=0; next_token_talloc(frame, &ipstr_list, &token_str,
+                               IPSTR_LIST_SEP) && i<count; i++ ) {
                char *s = token_str;
                char *p = strrchr(token_str, ':');
 
@@ -2449,7 +2371,7 @@ int ipstr_list_parse(const char *ipstr_list, struct ip_service **ip_list)
                        continue;
                }
        }
-
+       TALLOC_FREE(frame);
        return count;
 }
 
index d9995eca21e5aae6ffe1d77f336a4b5d84675940..916db2b3d354d36c36fa2da9acbbfb58b6f32ac9 100644 (file)
@@ -30,7 +30,6 @@ NTSTATUS gpo_explode_filesyspath(TALLOC_CTX *mem_ctx,
                                 char **nt_path,
                                 char **unix_path)
 {
-       fstring tok;
        char *path = NULL;
 
        *server = NULL;
@@ -42,22 +41,14 @@ NTSTATUS gpo_explode_filesyspath(TALLOC_CTX *mem_ctx,
                return NT_STATUS_OK;
        }
 
-       if (!next_token(&file_sys_path, tok, "\\", sizeof(tok))) {
+       if (!next_token_talloc(mem_ctx, &file_sys_path, server, "\\")) {
                return NT_STATUS_INVALID_PARAMETER;
        }
 
-       if ((*server = talloc_strdup(mem_ctx, tok)) == NULL) {
-               return NT_STATUS_NO_MEMORY;
-       }
-
-       if (!next_token(&file_sys_path, tok, "\\", sizeof(tok))) {
+       if (!next_token_talloc(mem_ctx, &file_sys_path, service, "\\")) {
                return NT_STATUS_INVALID_PARAMETER;
        }
 
-       if ((*service = talloc_strdup(mem_ctx, tok)) == NULL) {
-               return NT_STATUS_NO_MEMORY;
-       }
-
        if ((*nt_path = talloc_asprintf(mem_ctx, "\\%s", file_sys_path))
                == NULL) {
                return NT_STATUS_NO_MEMORY;
@@ -91,7 +82,7 @@ static NTSTATUS gpo_prepare_local_store(TALLOC_CTX *mem_ctx,
 {
        const char *top_dir = lock_path(GPO_CACHE_DIR);
        char *current_dir;
-       fstring tok;
+       char *tok;
 
        current_dir = talloc_strdup(mem_ctx, top_dir);
        NT_STATUS_HAVE_NO_MEMORY(current_dir);
@@ -100,15 +91,13 @@ static NTSTATUS gpo_prepare_local_store(TALLOC_CTX *mem_ctx,
                return NT_STATUS_ACCESS_DENIED;
        }
 
-       while (next_token(&unix_path, tok, "/", sizeof(tok))) {
-
+       while (next_token_talloc(mem_ctx, &unix_path, &tok, "/")) {
                if (strequal(tok, GPO_CACHE_DIR)) {
                        break;
                }
        }
 
-       while (next_token(&unix_path, tok, "/", sizeof(tok))) {
-
+       while (next_token_talloc(mem_ctx, &unix_path, &tok, "/")) {
                current_dir = talloc_asprintf_append_buffer(current_dir, "/%s", tok);
                NT_STATUS_HAVE_NO_MEMORY(current_dir);
 
index d996d61a485fd234544d9e03c756fd85908490e0..549574caada5de49d51ac45f248304a15301bfd6 100644 (file)
@@ -1592,6 +1592,7 @@ done:
        krb5_error_code ret = 0;
        TALLOC_CTX *mem_ctx;
        char keytab_string[MAX_KEYTAB_NAME_LEN];
+       char *kt_str = NULL;
        bool found_valid_name = False;
        const char *pragma = "FILE";
        const char *tmp = NULL;
@@ -1654,29 +1655,27 @@ done:
                ret = ENOMEM;
                goto out;
        }
-               
+
        if (strncmp(tmp, "ANY:", 4) == 0) {
                tmp += 4;
        }
 
        memset(&keytab_string, '\0', sizeof(keytab_string));
 
-       while (next_token(&tmp, keytab_string, ",", sizeof(keytab_string))) {
-
-               if (strncmp(keytab_string, "WRFILE:", 7) == 0) {
+       while (next_token_talloc(mem_ctx, &tmp, &kt_str, ",")) {
+               if (strncmp(kt_str, "WRFILE:", 7) == 0) {
                        found_valid_name = True;
-                       tmp = keytab_string;
+                       tmp = kt_str;
                        tmp += 7;
                }
 
-               if (strncmp(keytab_string, "FILE:", 5) == 0) {
+               if (strncmp(kt_str, "FILE:", 5) == 0) {
                        found_valid_name = True;
-                       tmp = keytab_string;
+                       tmp = kt_str;
                        tmp += 5;
                }
 
                if (found_valid_name) {
-
                        if (tmp[0] != '/') {
                                ret = KRB5_KT_BADNAME;
                                goto out;
@@ -1690,7 +1689,7 @@ done:
                        break;
                }
        }
-               
+
        if (!found_valid_name) {
                ret = KRB5_KT_UNKNOWN_TYPE;
                goto out;
index de2eaa7cfafdfc8cd9341095317a47392d635fe6..9f5567576f29be42232788dd400988f37bad0750 100644 (file)
@@ -4219,7 +4219,7 @@ parse_ace(struct cli_state *ipc_cli,
 {
        char *p;
        const char *cp;
-       fstring tok;
+       char *tok;
        unsigned int atype;
         unsigned int aflags;
         unsigned int amask;
@@ -4230,6 +4230,7 @@ parse_ace(struct cli_state *ipc_cli,
                 const char *perm;
                 uint32 mask;
         };
+       TALLOC_CTX *frame = talloc_stackframe();
 
         /* These values discovered by inspection */
         static const struct perm_value special_values[] = {
@@ -4252,7 +4253,10 @@ parse_ace(struct cli_state *ipc_cli,
 
        ZERO_STRUCTP(ace);
        p = strchr_m(str,':');
-       if (!p) return False;
+       if (!p) {
+               TALLOC_FREE(frame);
+               return False;
+       }
        *p = '\0';
        p++;
        /* Try to parse numeric form */
@@ -4265,12 +4269,14 @@ parse_ace(struct cli_state *ipc_cli,
        /* Try to parse text form */
 
        if (!convert_string_to_sid(ipc_cli, pol, numeric, &sid, str)) {
-               return False;
+               TALLOC_FREE(frame);
+               return false;
        }
 
        cp = p;
-       if (!next_token(&cp, tok, "/", sizeof(fstring))) {
-               return False;
+       if (!next_token_talloc(frame, &cp, &tok, "/")) {
+               TALLOC_FREE(frame);
+               return false;
        }
 
        if (StrnCaseCmp(tok, "ALLOWED", strlen("ALLOWED")) == 0) {
@@ -4278,23 +4284,27 @@ parse_ace(struct cli_state *ipc_cli,
        } else if (StrnCaseCmp(tok, "DENIED", strlen("DENIED")) == 0) {
                atype = SEC_ACE_TYPE_ACCESS_DENIED;
        } else {
-               return False;
+               TALLOC_FREE(frame);
+               return false;
        }
 
        /* Only numeric form accepted for flags at present */
 
-       if (!(next_token(&cp, tok, "/", sizeof(fstring)) &&
+       if (!(next_token_talloc(frame, &cp, &tok, "/") &&
              sscanf(tok, "%i", &aflags))) {
-               return False;
+               TALLOC_FREE(frame);
+               return false;
        }
 
-       if (!next_token(&cp, tok, "/", sizeof(fstring))) {
-               return False;
+       if (!next_token_talloc(frame, &cp, &tok, "/")) {
+               TALLOC_FREE(frame);
+               return false;
        }
 
        if (strncmp(tok, "0x", 2) == 0) {
                if (sscanf(tok, "%i", &amask) != 1) {
-                       return False;
+                       TALLOC_FREE(frame);
+                       return false;
                }
                goto done;
        }
@@ -4318,18 +4328,23 @@ parse_ace(struct cli_state *ipc_cli,
                        }
                }
 
-               if (!found) return False;
+               if (!found) {
+                       TALLOC_FREE(frame);
+                       return false;
+               }
                p++;
        }
 
        if (*p) {
-               return False;
+               TALLOC_FREE(frame);
+               return false;
        }
 
  done:
        mask = amask;
        init_sec_ace(ace, &sid, atype, mask, aflags);
-       return True;
+       TALLOC_FREE(frame);
+       return true;
 }
 
 /* add an ACE to a list of ACEs in a SEC_ACL */
@@ -4368,7 +4383,7 @@ sec_desc_parse(TALLOC_CTX *ctx,
                char *str)
 {
        const char *p = str;
-       fstring tok;
+       char *tok;
        SEC_DESC *ret = NULL;
        size_t sd_size;
        DOM_SID *group_sid=NULL;
@@ -4376,7 +4391,7 @@ sec_desc_parse(TALLOC_CTX *ctx,
        SEC_ACL *dacl=NULL;
        int revision=1;
 
-       while (next_token(&p, tok, "\t,\r\n", sizeof(tok))) {
+       while (next_token_talloc(ctx, &p, &tok, "\t,\r\n")) {
 
                if (StrnCaseCmp(tok,"REVISION:", 9) == 0) {
                        revision = strtol(tok+9, NULL, 16);
@@ -4544,7 +4559,8 @@ dos_attr_parse(SMBCCTX *context,
 {
         int n;
         const char *p = str;
-       fstring tok;
+       char *tok = NULL;
+       TALLOC_CTX *frame = NULL;
         struct {
                 const char * create_time_attr;
                 const char * access_time_attr;
@@ -4577,8 +4593,8 @@ dos_attr_parse(SMBCCTX *context,
                 }
         }
 
-       while (next_token(&p, tok, "\t,\r\n", sizeof(tok))) {
-
+       frame = talloc_stackframe();
+       while (next_token_talloc(frame, &p, &tok, "\t,\r\n")) {
                if (StrnCaseCmp(tok, "MODE:", 5) == 0) {
                        dad->mode = strtol(tok+5, NULL, 16);
                        continue;
@@ -4622,6 +4638,7 @@ dos_attr_parse(SMBCCTX *context,
                        continue;
                }
        }
+       TALLOC_FREE(frame);
 }
 
 /*****************************************************
index 04db3322caf7cafa9f83513a915b64da0be1e4a9..9650b5fc4555e4e0a20d6b663e7981c5e70138b9 100644 (file)
@@ -791,10 +791,10 @@ bool getlmhostsent(TALLOC_CTX *ctx, XFILE *fp, char **pp_name, int *name_type,
        *pp_name = NULL;
 
        while(!x_feof(fp) && !x_ferror(fp)) {
-               char ip[INET6_ADDRSTRLEN];
-               fstring flags;
-               fstring extra;
-               fstring name;
+               char *ip;
+               char *flags;
+               char *extra;
+               char *name;
                const char *ptr;
                char *ptr1;
                int count = 0;
@@ -815,13 +815,13 @@ bool getlmhostsent(TALLOC_CTX *ctx, XFILE *fp, char **pp_name, int *name_type,
 
                ptr = line;
 
-               if (next_token(&ptr,ip   ,NULL,sizeof(ip)))
+               if (next_token_talloc(ctx, &ptr, &ip, NULL))
                        ++count;
-               if (next_token(&ptr,name ,NULL, sizeof(name)))
+               if (next_token_talloc(ctx, &ptr, &name, NULL))
                        ++count;
-               if (next_token(&ptr,flags,NULL, sizeof(flags)))
+               if (next_token_talloc(ctx, &ptr, &flags, NULL))
                        ++count;
-               if (next_token(&ptr,extra,NULL, sizeof(extra)))
+               if (next_token_talloc(ctx, &ptr, &extra, NULL))
                        ++count;
 
                if (count <= 0)
@@ -1422,10 +1422,11 @@ NTSTATUS internal_resolve_name(const char *name,
                                const char *resolve_order)
 {
        const char *name_resolve_list;
-       fstring tok;
+       char *tok;
        const char *ptr;
        NTSTATUS status = NT_STATUS_UNSUCCESSFUL;
        int i;
+       TALLOC_CTX *frame = NULL;
 
        *return_iplist = NULL;
        *return_count = 0;
@@ -1488,7 +1489,8 @@ NTSTATUS internal_resolve_name(const char *name,
 
        /* iterate through the name resolution backends */
 
-       while (next_token(&ptr, tok, LIST_SEP, sizeof(tok))) {
+       frame = talloc_stackframe();
+       while (next_token_talloc(frame, &ptr, &tok, LIST_SEP)) {
                if((strequal(tok, "host") || strequal(tok, "hosts"))) {
                        status = resolve_hosts(name, name_type, return_iplist,
                                               return_count);
@@ -1545,6 +1547,7 @@ NTSTATUS internal_resolve_name(const char *name,
 
        /* All of the resolve_* functions above have returned false. */
 
+       TALLOC_FREE(frame);
        SAFE_FREE(*return_iplist);
        *return_count = 0;
 
@@ -1595,6 +1598,7 @@ NTSTATUS internal_resolve_name(const char *name,
                DEBUG(10, ("\n"));
        }
 
+       TALLOC_FREE(frame);
        return status;
 }
 
@@ -1738,7 +1742,7 @@ static NTSTATUS get_dc_list(const char *domain,
        const char *p;
        char *port_str = NULL;
        int port;
-       fstring name;
+       char *name;
        int num_addresses = 0;
        int  local_count, i, j;
        struct ip_service *return_iplist = NULL;
@@ -1826,7 +1830,7 @@ static NTSTATUS get_dc_list(const char *domain,
         */
 
        p = pserver;
-       while (next_token(&p,name,LIST_SEP,sizeof(name))) {
+       while (next_token_talloc(ctx, &p, &name, LIST_SEP)) {
                if (strequal(name, "*")) {
                        status = internal_resolve_name(domain, 0x1C, sitename,
                                                       &auto_ip_list,
@@ -1870,7 +1874,7 @@ static NTSTATUS get_dc_list(const char *domain,
        /* fill in the return list now with real IP's */
 
        while ((local_count<num_addresses) &&
-                       next_token(&p,name,LIST_SEP,sizeof(name))) {
+                       next_token_talloc(ctx, &p, &name, LIST_SEP)) {
                struct sockaddr_storage name_ss;
 
                /* copy any addersses from the auto lookup */
index a4e646771ff98ca4ea24e3696cb71ca9d21a35c8..3cc9bb52b0957222c3e89a5625c29ab988db4dcb 100644 (file)
@@ -457,10 +457,11 @@ void announce_remote(time_t t)
        char *s;
        const char *ptr;
        static time_t last_time = 0;
-       fstring s2;
+       char *s2;
        struct in_addr addr;
        char *comment;
        int stype = lp_default_server_announce();
+       TALLOC_CTX *frame = NULL;
 
        if (last_time && (t < (last_time + REMOTE_ANNOUNCE_INTERVAL)))
                return;
@@ -473,7 +474,8 @@ void announce_remote(time_t t)
 
        comment = string_truncate(lp_serverstring(), MAX_SERVER_STRING_LENGTH);
 
-       for (ptr=s; next_token(&ptr,s2,NULL,sizeof(s2)); ) {
+       frame = talloc_stackframe();
+       for (ptr=s; next_token_talloc(frame,&ptr,&s2,NULL); ) {
                /* The entries are of the form a.b.c.d/WORKGROUP with
                                WORKGROUP being optional */
                const char *wgroup;
@@ -510,6 +512,7 @@ void announce_remote(time_t t)
                                                comment);
                }
        }
+       TALLOC_FREE(frame);
 }
 
 /****************************************************************************
@@ -522,12 +525,13 @@ void browse_sync_remote(time_t t)
        char *s;
        const char *ptr;
        static time_t last_time = 0;
-       fstring s2;
+       char *s2;
        struct in_addr addr;
        struct work_record *work;
        char outbuf[1024];
        char *p;
        unstring myname;
+       TALLOC_CTX *frame = NULL;
 
        if (last_time && (t < (last_time + REMOTE_ANNOUNCE_INTERVAL)))
                return;
@@ -567,7 +571,8 @@ for workgroup %s on subnet %s.\n", lp_workgroup(), FIRST_SUBNET->subnet_name ));
 
        p = skip_string(outbuf,sizeof(outbuf),p);
 
-       for (ptr=s; next_token(&ptr,s2,NULL,sizeof(s2)); ) {
+       frame = talloc_stackframe();
+       for (ptr=s; next_token_talloc(frame,&ptr,&s2,NULL); ) {
                /* The entries are of the form a.b.c.d */
                (void)interpret_addr2(&addr,s2);
 
@@ -577,4 +582,5 @@ for workgroup %s on subnet %s.\n", lp_workgroup(), FIRST_SUBNET->subnet_name ));
                send_mailslot(True, BROWSE_MAILSLOT, outbuf,PTR_DIFF(p,outbuf),
                        global_myname(), 0x0, "*", 0x0, addr, FIRST_SUBNET->myip, DGRAM_PORT);
        }
+       TALLOC_FREE(frame);
 }
index 8abf60c8ce772ba489f6099ad305b0d3ea624c15..147df68a69d9787ebf039ed68ed80c5d4278c546 100644 (file)
@@ -201,7 +201,7 @@ done:
  Handle one line from a completed sync file.
  **********************************************************************/
 
-static void complete_one(struct sync_record *s, 
+static void complete_one(struct sync_record *s,
                         char *sname, uint32 stype, char *comment)
 {
        struct work_record *work;
@@ -258,9 +258,10 @@ static void complete_one(struct sync_record *s,
 static void complete_sync(struct sync_record *s)
 {
        XFILE *f;
-       unstring server, type_str;
+       char *server;
+       char *type_str;
        unsigned type;
-       fstring comment;
+       char *comment;
        char line[1024];
        const char *ptr;
        int count=0;
@@ -271,15 +272,18 @@ static void complete_sync(struct sync_record *s)
                return;
 
        while (!x_feof(f)) {
+               TALLOC_CTX *frame = NULL;
 
                if (!fgets_slash(line,sizeof(line),f))
                        continue;
 
                ptr = line;
 
-               if (!next_token(&ptr,server,NULL,sizeof(server)) ||
-                   !next_token(&ptr,type_str,NULL, sizeof(type_str)) ||
-                   !next_token(&ptr,comment,NULL, sizeof(comment))) {
+               frame = talloc_stackframe();
+               if (!next_token_talloc(frame,&ptr,&server,NULL) ||
+                   !next_token_talloc(frame,&ptr,&type_str,NULL) ||
+                   !next_token_talloc(frame,&ptr,&comment,NULL)) {
+                       TALLOC_FREE(frame);
                        continue;
                }
 
@@ -288,8 +292,8 @@ static void complete_sync(struct sync_record *s)
                complete_one(s, server, type, comment);
 
                count++;
+               TALLOC_FREE(frame);
        }
-
        x_fclose(f);
 
        unlink(s->fname);
index 88cc395af41850781578d40d3596bc0bea1f4caf..7dafa66b11730759cbb2c49eb5157e88ed6a5b13 100644 (file)
@@ -601,30 +601,33 @@ bool initialise_wins(void)
        }
 
        while (!x_feof(fp)) {
-               fstring name_str;
-               char ip_str[1024];
-               fstring ttl_str, nb_flags_str;
+               char *name_str = NULL;
+               char *ip_str = NULL;
+               char *ttl_str = NULL, *nb_flags_str = NULL;
                unsigned int num_ips;
-               char *name;
-               struct in_addr *ip_list;
+               char *name = NULL;
+               struct in_addr *ip_list = NULL;
                int type = 0;
                int nb_flags;
                int ttl;
                const char *ptr;
-               char *p;
+               char *p = NULL;
                bool got_token;
                bool was_ip;
                int i;
                unsigned int hash;
                int version;
+               TALLOC_CTX *frame = NULL;
 
                /* Read a line from the wins.dat file. Strips whitespace
                        from the beginning and end of the line.  */
-               if (!fgets_slash(line,sizeof(line),fp))
+               if (!fgets_slash(line,sizeof(line),fp)) {
                        continue;
+               }
 
-               if (*line == '#')
+               if (*line == '#') {
                        continue;
+               }
 
                if (strncmp(line,"VERSION ", 8) == 0) {
                        if (sscanf(line,"VERSION %d %u", &version, &hash) != 2 ||
@@ -645,13 +648,16 @@ bool initialise_wins(void)
                 * time to actually parse them into the ip_list array.
                 */
 
-               if (!next_token(&ptr,name_str,NULL,sizeof(name_str))) {
+               frame = talloc_stackframe();
+               if (!next_token_talloc(frame,&ptr,&name_str,NULL)) {
                        DEBUG(0,("initialise_wins: Failed to parse name when parsing line %s\n", line ));
+                       TALLOC_FREE(frame);
                        continue;
                }
 
-               if (!next_token(&ptr,ttl_str,NULL,sizeof(ttl_str))) {
+               if (!next_token_talloc(frame,&ptr,ttl_str,NULL)) {
                        DEBUG(0,("initialise_wins: Failed to parse time to live when parsing line %s\n", line ));
+                       TALLOC_FREE(frame);
                        continue;
                }
 
@@ -660,22 +666,24 @@ bool initialise_wins(void)
                 */
                num_ips = 0;
                do {
-                       got_token = next_token(&ptr,ip_str,NULL,sizeof(ip_str));
+                       got_token = next_token_talloc(frame,&ptr,&ip_str,NULL);
                        was_ip = False;
 
                        if(got_token && strchr(ip_str, '.')) {
                                num_ips++;
                                was_ip = True;
                        }
-               } while( got_token && was_ip);
+               } while(got_token && was_ip);
 
                if(num_ips == 0) {
                        DEBUG(0,("initialise_wins: Missing IP address when parsing line %s\n", line ));
+                       TALLOC_FREE(frame);
                        continue;
                }
 
                if(!got_token) {
                        DEBUG(0,("initialise_wins: Missing nb_flags when parsing line %s\n", line ));
+                       TALLOC_FREE(frame);
                        continue;
                }
 
@@ -683,20 +691,21 @@ bool initialise_wins(void)
                if((ip_list = SMB_MALLOC_ARRAY( struct in_addr, num_ips)) == NULL) {
                        DEBUG(0,("initialise_wins: Malloc fail !\n"));
                        x_fclose(fp);
+                       TALLOC_FREE(frame);
                        return False;
                }
 
                /* Reset and re-parse the line. */
                ptr = line;
-               next_token(&ptr,name_str,NULL,sizeof(name_str));
-               next_token(&ptr,ttl_str,NULL,sizeof(ttl_str));
+               next_token_talloc(frame,&ptr,&name_str,NULL);
+               next_token_talloc(frame,&ptr,&ttl_str,NULL);
                for(i = 0; i < num_ips; i++) {
-                       next_token(&ptr, ip_str, NULL, sizeof(ip_str));
+                       next_token_talloc(frame,&ptr, &ip_str, NULL);
                        (void)interpret_addr2(&ip_list[i], ip_str);
                }
-               next_token(&ptr,nb_flags_str,NULL, sizeof(nb_flags_str));
+               next_token_talloc(frame,&ptr,&nb_flags_str,NULL);
 
-               /* 
+               /*
                 * Deal with SELF or REGISTER name encoding. Default is REGISTER
                 * for compatibility with old nmbds.
                 */
@@ -704,6 +713,7 @@ bool initialise_wins(void)
                if(nb_flags_str[strlen(nb_flags_str)-1] == 'S') {
                        DEBUG(5,("initialise_wins: Ignoring SELF name %s\n", line));
                        SAFE_FREE(ip_list);
+                       TALLOC_FREE(frame);
                        continue;
                }
 
@@ -740,9 +750,10 @@ bool initialise_wins(void)
                                name, type, ttl, inet_ntoa(ip_list[0]), nb_flags));
                }
 
+               TALLOC_FREE(frame);
                SAFE_FREE(ip_list);
-       } 
-    
+       }
+
        x_fclose(fp);
        return True;
 }
index 488a080287b266ba433099d04a1609b4ec9fda64..481f51779f74d9f5d8abc9208270db7cb9b84cd2 100644 (file)
@@ -374,20 +374,23 @@ static bool wbinfo_list_domains(bool list_all_domains)
 
        if (response.extra_data.data) {
                const char *extra_data = (char *)response.extra_data.data;
-               fstring name;
+               char *name;
                char *p;
+               TALLOC_CTX *frame = talloc_stackframe();
 
-               while(next_token(&extra_data, name, "\n", sizeof(fstring))) {
+               while(next_token_talloc(frame,&extra_data,&name,"\n")) {
                        p = strchr(name, '\\');
                        if (p == 0) {
                                d_fprintf(stderr, "Got invalid response: %s\n",
                                         extra_data);
+                               TALLOC_FREE(frame);
+                               SAFE_FREE(response.extra_data.data);
                                return False;
                        }
                        *p = 0;
                        d_printf("%s\n", name);
                }
-
+               TALLOC_FREE(frame);
                SAFE_FREE(response.extra_data.data);
        }
 
@@ -713,7 +716,7 @@ static bool wbinfo_lookuprids(char *domain, char *arg)
        int num_rids;
        uint32 *rids;
        const char *p;
-       char ridstr[32];
+       char *ridstr;
        const char **names;
        enum lsa_SidType *types;
        const char *domain_name;
@@ -752,7 +755,7 @@ static bool wbinfo_lookuprids(char *domain, char *arg)
        rids = NULL;
        p = arg;
 
-       while (next_token(&p, ridstr, " ,\n", sizeof(ridstr))) {
+       while (next_token_talloc(mem_ctx, &p, &ridstr, " ,\n")) {
                uint32 rid = strtoul(ridstr, NULL, 10);
                ADD_TO_ARRAY(mem_ctx, uint32, rid, &rids, &num_rids);
        }
@@ -1072,13 +1075,14 @@ static bool print_domain_users(const char *domain)
        struct winbindd_request request;
        struct winbindd_response response;
        const char *extra_data;
-       fstring name;
+       char *name;
+       TALLOC_CTX *frame = NULL;
 
        /* Send request to winbind daemon */
 
        ZERO_STRUCT(request);
        ZERO_STRUCT(response);
-       
+
        if (domain) {
                /* '.' is the special sign for our own domain */
                if ( strequal(domain, ".") )
@@ -1098,9 +1102,11 @@ static bool print_domain_users(const char *domain)
 
        extra_data = (const char *)response.extra_data.data;
 
-       while(next_token(&extra_data, name, ",", sizeof(fstring)))
+       frame = talloc_stackframe();
+       while(next_token_talloc(frame,&extra_data,&name, ","))
                d_printf("%s\n", name);
-       
+       TALLOC_FREE(frame);
+
        SAFE_FREE(response.extra_data.data);
 
        return True;
@@ -1113,7 +1119,8 @@ static bool print_domain_groups(const char *domain)
        struct winbindd_request  request;
        struct winbindd_response response;
        const char *extra_data;
-       fstring name;
+       TALLOC_CTX *frame = NULL;
+       char *name;
 
        ZERO_STRUCT(request);
        ZERO_STRUCT(response);
@@ -1136,11 +1143,13 @@ static bool print_domain_groups(const char *domain)
 
        extra_data = (const char *)response.extra_data.data;
 
-       while(next_token(&extra_data, name, ",", sizeof(fstring)))
+       frame = talloc_stackframe();
+       while(next_token_talloc(frame,&extra_data,&name, ","))
                d_printf("%s\n", name);
+       TALLOC_FREE(frame);
 
        SAFE_FREE(response.extra_data.data);
-       
+
        return True;
 }
 
index 7322da000110f3fd011bac7da28d7c869007d992..bfac2ecdd14a106efd5bcb031929d9e8a0953a23 100644 (file)
@@ -85,7 +85,7 @@ static char *get_static(char **buffer, size_t *buflen, size_t len)
 
        /* Error check.  We return false if things aren't set up right, or
           there isn't enough buffer space left. */
-       
+
        if ((buffer == NULL) || (buflen == NULL) || (*buflen < len)) {
                return NULL;
        }
@@ -99,46 +99,79 @@ static char *get_static(char **buffer, size_t *buflen, size_t len)
        return result;
 }
 
-/* I've copied the strtok() replacement function next_token() from
+/* I've copied the strtok() replacement function next_token_Xalloc() from
    lib/util_str.c as I really don't want to have to link in any other
    objects if I can possibly avoid it. */
 
-static bool next_token(char **ptr,char *buff,const char *sep, size_t bufsize)
+static bool next_token_alloc(const char **ptr,
+                                char **pp_buff,
+                                const char *sep)
 {
        char *s;
+       char *saved_s;
+       char *pbuf;
        bool quoted;
        size_t len=1;
 
-       if (!ptr) return false;
+       *pp_buff = NULL;
+       if (!ptr) {
+               return(false);
+       }
 
-       s = *ptr;
+       s = (char *)*ptr;
 
        /* default to simple separators */
-       if (!sep) sep = " \t\n\r";
+       if (!sep) {
+               sep = " \t\n\r";
+       }
 
        /* find the first non sep char */
-       while (*s && strchr(sep,*s)) s++;
-       
+       while (*s && strchr(sep,*s)) {
+               s++;
+       }
+
        /* nothing left? */
-       if (! *s) return false;
-       
-       /* copy over the token */
-       for (quoted = false; len < bufsize && *s && (quoted || !strchr(sep,*s)); s++) {
+       if (!*s) {
+               return false;
+       }
+
+       /* When restarting we need to go from here. */
+       saved_s = s;
+
+       /* Work out the length needed. */
+       for (quoted = false; *s &&
+                       (quoted || !strchr(sep,*s)); s++) {
                if (*s == '\"') {
                        quoted = !quoted;
                } else {
                        len++;
-                       *buff++ = *s;
                }
        }
-       
-       *ptr = (*s) ? s+1 : s;  
-       *buff = 0;
-       
+
+       /* We started with len = 1 so we have space for the nul. */
+       *pp_buff = malloc(len);
+       if (!*pp_buff) {
+               return false;
+       }
+
+       /* copy over the token */
+       pbuf = *pp_buff;
+       s = saved_s;
+       for (quoted = false; *s &&
+                       (quoted || !strchr(sep,*s)); s++) {
+               if ( *s == '\"' ) {
+                       quoted = !quoted;
+               } else {
+                       *pbuf++ = *s;
+               }
+       }
+
+       *ptr = (*s) ? s+1 : s;
+       *pbuf = 0;
+
        return true;
 }
 
-
 /* Fill a pwent structure from a winbindd_response structure.  We use
    the static data passed to us by libc to put strings and stuff in.
    Return NSS_STATUS_TRYAGAIN if we run out of memory. */
@@ -233,7 +266,7 @@ static NSS_STATUS fill_pwent(struct passwd *result,
 static NSS_STATUS fill_grent(struct group *result, struct winbindd_gr *gr,
                      char *gr_mem, char **buffer, size_t *buflen)
 {
-       fstring name;
+       char *name;
        int i;
        char *tst;
 
@@ -255,7 +288,6 @@ static NSS_STATUS fill_grent(struct group *result, struct winbindd_gr *gr,
             get_static(buffer, buflen, strlen(gr->gr_passwd) + 1)) == NULL) {
 
                /* Out of memory */
-               
                return NSS_STATUS_TRYAGAIN;
        }
 
@@ -276,8 +308,8 @@ static NSS_STATUS fill_grent(struct group *result, struct winbindd_gr *gr,
        /* Calculate number of extra bytes needed to align on pointer size boundry */
        if ((i = (unsigned long)(*buffer) % sizeof(char*)) != 0)
                i = sizeof(char*) - i;
-       
-       if ((tst = get_static(buffer, buflen, ((gr->num_gr_mem + 1) * 
+
+       if ((tst = get_static(buffer, buflen, ((gr->num_gr_mem + 1) *
                                 sizeof(char *)+i))) == NULL) {
 
                /* Out of memory */
@@ -298,19 +330,16 @@ static NSS_STATUS fill_grent(struct group *result, struct winbindd_gr *gr,
 
        i = 0;
 
-       while(next_token((char **)&gr_mem, name, ",", sizeof(fstring))) {
-        
+       while(next_token_alloc((const char **)&gr_mem, &name, ",")) {
                /* Allocate space for member */
-        
-               if (((result->gr_mem)[i] = 
+               if (((result->gr_mem)[i] =
                     get_static(buffer, buflen, strlen(name) + 1)) == NULL) {
-            
+                       free(name);
                        /* Out of memory */
-            
                        return NSS_STATUS_TRYAGAIN;
-               }        
-        
+               }
                strcpy((result->gr_mem)[i], name);
+               free(name);
                i++;
        }
 
index 7a3d55999ead00060cd459afb4c068195610aaea..205ca68fe3e5651a324bab18c68b8085046166d4 100644 (file)
@@ -194,7 +194,7 @@ static NTSTATUS ldapsam_get_seq_num(struct pdb_methods *my_methods, time_t *seq_
        char **values = NULL;
        int rc, num_result, num_values, rid;
        char *suffix = NULL;
-       fstring tok;
+       char *tok;
        const char *p;
        const char **attrs;
 
@@ -292,7 +292,7 @@ static NTSTATUS ldapsam_get_seq_num(struct pdb_methods *my_methods, time_t *seq_
        }
 
        p = values[0];
-       if (!next_token(&p, tok, "#", sizeof(tok))) {
+       if (!next_token_talloc(mem_ctx, &p, &tok, "#")) {
                DEBUG(0,("ldapsam_get_seq_num: failed to parse sequence number\n"));
                goto done;
        }
index d4520b04bab4bd8bfcd861d05a13c8bdf8ad4096..56e228f2196885fcf6fd27b68ad2d7881d3254a8 100644 (file)
@@ -27,7 +27,7 @@ static const char *Months[13] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
  Process time fields
 ********************************************************************/
 
-static time_t EntryTime(fstring tok[], int ptr, int count, int minimum)
+static time_t EntryTime(char *tok[], int ptr, int count, int minimum)
 {
        time_t jobtime,jobtime1;
 
@@ -35,7 +35,6 @@ static time_t EntryTime(fstring tok[], int ptr, int count, int minimum)
        if (count >= minimum) {
                struct tm *t;
                int i, day, hour, min, sec;
-               char   *c;
 
                for (i=0; i<13; i++) {
                        if (!strncmp(tok[ptr], Months[i],3)) {
@@ -44,12 +43,13 @@ static time_t EntryTime(fstring tok[], int ptr, int count, int minimum)
                }
 
                if (i<12) {
+                       fstring c;
                        t = localtime(&jobtime);
                        if (!t) {
                                return (time_t)-1;
                        }
                        day = atoi(tok[ptr+1]);
-                       c=(char *)(tok[ptr+2]);
+                       fstrcpy(c,tok[ptr+2]);
                        *(c+2)=0;
                        hour = atoi(c);
                        *(c+5)=0;
@@ -143,7 +143,7 @@ static bool parse_lpq_bsd(char *line,print_queue_struct *buf,bool first)
        }
 #endif /* OSF1 */
 
-       /* FIXME: Use next_token rather than strtok! */
+       /* FIXME: Use next_token_talloc rather than strtok! */
        tok[0] = strtok(line2," \t");
        count++;
 
@@ -255,22 +255,26 @@ static bool parse_lpq_lprng(char *line,print_queue_struct *buf,bool first)
 #define        LPRNG_NTOK      7
 #define        LPRNG_MAXTOK    128 /* PFMA just to keep us from running away. */
 
-       fstring tokarr[LPRNG_MAXTOK];
+       char *tokarr[LPRNG_MAXTOK];
        const char *cptr;
        char *ptr;
        int num_tok = 0;
+       TALLOC_CTX *frame = talloc_stackframe();
 
        cptr = line;
-       while((num_tok < LPRNG_MAXTOK) && next_token( &cptr, tokarr[num_tok], " \t", sizeof(fstring))) {
+       while((num_tok < LPRNG_MAXTOK) && next_token_talloc(frame, &cptr,
+                               &tokarr[num_tok], " \t")) {
                num_tok++;
        }
 
        /* We must get at least LPRNG_NTOK tokens. */
        if (num_tok < LPRNG_NTOK) {
+               TALLOC_FREE(frame);
                return False;
        }
 
        if (!isdigit((int)*tokarr[LPRNG_JOBTOK]) || !isdigit((int)*tokarr[LPRNG_TOTALTOK])) {
+               TALLOC_FREE(frame);
                return False;
        }
 
@@ -317,6 +321,7 @@ static bool parse_lpq_lprng(char *line,print_queue_struct *buf,bool first)
                buf->fs_file[sizeof(buf->fs_file)-1] = '\0';
        }
 
+       TALLOC_FREE(frame);
        return True;
 }
 
@@ -335,16 +340,18 @@ lazer   lazer RUNNING   537 6297doc.A          kvintus@IE    0 10  2445   1   1
 
 static bool parse_lpq_aix(char *line,print_queue_struct *buf,bool first)
 {
-       fstring tok[11];
+       char *tok[11];
        int count=0;
        const char *cline = line;
+       TALLOC_CTX *frame = talloc_stackframe();
 
        /* handle the case of "(standard input)" as a filename */
        string_sub(line,"standard input","STDIN",0);
        all_string_sub(line,"(","\"",0);
        all_string_sub(line,")","\"",0);
 
-       for (count=0; count<10 && next_token(&cline,tok[count],NULL, sizeof(tok[count])); count++) {
+       for (count=0; count<10 &&
+                       next_token_talloc(frame,&cline,&tok[count],NULL); count++) {
                ;
        }
 
@@ -353,21 +360,24 @@ static bool parse_lpq_aix(char *line,print_queue_struct *buf,bool first)
                if ((count == 7) && ((strcmp(tok[0],"QUEUED") == 0) || (strcmp(tok[0],"HELD") == 0))) {
                        /* the 2nd and 5th columns must be integer */
                        if (!isdigit((int)*tok[1]) || !isdigit((int)*tok[4])) {
+                               TALLOC_FREE(frame);
                                return False;
                        }
                        buf->size = atoi(tok[4]) * 1024;
                        /* if the fname contains a space then use STDIN */
                        if (strchr_m(tok[2],' ')) {
-                               fstrcpy(tok[2],"STDIN");
+                               tok[2] = talloc_strdup(frame,"STDIN");
+                               if (!tok[2]) {
+                                       TALLOC_FREE(frame);
+                                       return false;
+                               }
                        }
 
                        /* only take the last part of the filename */
                        {
-                               fstring tmp;
                                char *p = strrchr_m(tok[2],'/');
                                if (p) {
-                                       fstrcpy(tmp,p+1);
-                                       fstrcpy(tok[2],tmp);
+                                       tok[2] = p+1;
                                }
                        }
 
@@ -379,27 +389,31 @@ static bool parse_lpq_aix(char *line,print_queue_struct *buf,bool first)
                        fstrcpy(buf->fs_file,tok[2]);
                } else {
                        DEBUG(6,("parse_lpq_aix count=%d\n", count));
+                       TALLOC_FREE(frame);
                        return False;
                }
        } else {
                /* the 4th and 9th columns must be integer */
                if (!isdigit((int)*tok[3]) || !isdigit((int)*tok[8])) {
+                       TALLOC_FREE(frame);
                        return False;
                }
 
                buf->size = atoi(tok[8]) * 1024;
                /* if the fname contains a space then use STDIN */
                if (strchr_m(tok[4],' ')) {
-                       fstrcpy(tok[4],"STDIN");
+                       tok[4] = talloc_strdup(frame,"STDIN");
+                       if (!tok[4]) {
+                               TALLOC_FREE(frame);
+                               return false;
+                       }
                }
 
                /* only take the last part of the filename */
                {
-                       fstring tmp;
                        char *p = strrchr_m(tok[4],'/');
                        if (p) {
-                               fstrcpy(tmp,p+1);
-                               fstrcpy(tok[4],tmp);
+                               tok[4] = p+1;
                        }
                }
 
@@ -411,6 +425,7 @@ static bool parse_lpq_aix(char *line,print_queue_struct *buf,bool first)
                fstrcpy(buf->fs_file,tok[4]);
        }
 
+       TALLOC_FREE(frame);
        return True;
 }
 
@@ -438,12 +453,13 @@ static bool parse_lpq_hpux(char *line, print_queue_struct *buf, bool first)
                with -p option first, to work */
        static int base_prio;
        int count;
-       char htab = '\011';  
+       char htab = '\011';
        const char *cline = line;
-       fstring tok[12];
+       char *tok[12];
+       TALLOC_CTX *frame = talloc_stackframe();
 
        /* If a line begins with a horizontal TAB, it is a subline type */
-  
+
        if (line[0] == htab) { /* subline */
                /* check if it contains the base priority */
                if (!strncmp(line,"\tfence priority : ",18)) {
@@ -452,6 +468,7 @@ static bool parse_lpq_hpux(char *line, print_queue_struct *buf, bool first)
                }
 
                if (!header_line_ok) {
+                       TALLOC_FREE(frame);
                        return  False; /* incorrect header line */
                }
 
@@ -459,35 +476,44 @@ static bool parse_lpq_hpux(char *line, print_queue_struct *buf, bool first)
                string_sub(line,"standard input","STDIN",0);
                all_string_sub(line,"(","\"",0);
                all_string_sub(line,")","\"",0);
-    
-               for (count=0; count<2 && next_token(&cline,tok[count],NULL,sizeof(tok[count])); count++) {
+
+               for (count=0; count<2 &&
+                               next_token_talloc(frame, &cline, &tok[count],NULL);
+                               count++) {
                        ;
                }
                /* we must get 2 tokens */
                if (count < 2) {
+                       TALLOC_FREE(frame);
                        return False;
                }
-    
+
                /* the 2nd column must be integer */
                if (!isdigit((int)*tok[1])) {
+                       TALLOC_FREE(frame);
                        return False;
                }
-    
+
                /* if the fname contains a space then use STDIN */
                if (strchr_m(tok[0],' ')) {
-                       fstrcpy(tok[0],"STDIN");
+                       tok[0] = talloc_strdup(frame, "STDIN");
+                       if (!tok[0]) {
+                               TALLOC_FREE(frame);
+                               return false;
+                       }
                }
-    
+
                buf->size = atoi(tok[1]);
                fstrcpy(buf->fs_file,tok[0]);
-    
+
                /* fill things from header line */
                buf->time = jobtime;
                buf->job = jobid;
                buf->status = jobstat;
                buf->priority = jobprio;
                fstrcpy(buf->fs_user,jobuser);
-    
+
+               TALLOC_FREE(frame);
                return True;
        } else { /* header line */
                header_line_ok=False; /* reset it */
@@ -499,28 +525,32 @@ static bool parse_lpq_hpux(char *line, print_queue_struct *buf, bool first)
                } else if (base_prio) {
                        base_prio_reset=False;
                }
-    
+
                /* handle the dash in the job id */
                string_sub(line,"-"," ",0);
-    
-               for (count=0; count<12 && next_token(&cline,tok[count],NULL,sizeof(tok[count])); count++) {
+
+               for (count=0; count<12 &&
+                               next_token_talloc(frame, &cline, &tok[count],NULL);
+                               count++) {
                        ;
                }
-      
+
                /* we must get 8 tokens */
                if (count < 8) {
+                       TALLOC_FREE(frame);
                        return False;
                }
-    
+
                /* first token must be printer name (cannot check ?) */
                /* the 2nd, 5th & 7th column must be integer */
                if (!isdigit((int)*tok[1]) || !isdigit((int)*tok[4]) || !isdigit((int)*tok[6])) {
+                       TALLOC_FREE(frame);
                        return False;
                }
                jobid = atoi(tok[1]);
                fstrcpy(jobuser,tok[2]);
                jobprio = atoi(tok[4]);
-    
+
                /* process time */
                jobtime=EntryTime(tok, 5, count, 8);
                if (jobprio < base_prio) {
@@ -535,8 +565,9 @@ static bool parse_lpq_hpux(char *line, print_queue_struct *buf, bool first)
                                jobstat = LPQ_PRINTING;
                        }
                }
-    
+
                header_line_ok=True; /* information is correct */
+               TALLOC_FREE(frame);
                return False; /* need subline info to include into queuelist */
        }
 }
@@ -553,12 +584,13 @@ dcslw-897               tridge            4712   Dec 20 10:30:30 being held
 
 static bool parse_lpq_sysv(char *line,print_queue_struct *buf,bool first)
 {
-       fstring tok[9];
+       char *tok[9];
        int count=0;
        char *p;
        const char *cline = line;
+       TALLOC_CTX *frame = NULL;
 
-       /* 
+       /*
         * Handle the dash in the job id, but make sure that we skip over
         * the printer name in case we have a dash in that.
         * Patch from Dom.Mitchell@palmerharvey.co.uk.
@@ -583,28 +615,32 @@ static bool parse_lpq_sysv(char *line,print_queue_struct *buf,bool first)
                *p = ' ';
        }
 
-       for (count=0; count<9 && next_token(&cline,tok[count],NULL,sizeof(tok[count])); count++) {
+       frame = talloc_stackframe();
+       for (count=0; count<9 &&
+                       next_token_talloc(frame, &cline, &tok[count],NULL);
+                       count++) {
                ;
        }
 
        /* we must get 7 tokens */
        if (count < 7) {
+               TALLOC_FREE(frame);
                return False;
        }
 
        /* the 2nd and 4th, 6th columns must be integer */
        if (!isdigit((int)*tok[1]) || !isdigit((int)*tok[3])) {
+               TALLOC_FREE(frame);
                return False;
        }
        if (!isdigit((int)*tok[5])) {
+               TALLOC_FREE(frame);
                return False;
        }
 
-       /* if the user contains a ! then trim the first part of it */  
+       /* if the user contains a ! then trim the first part of it */
        if ((p=strchr_m(tok[2],'!'))) {
-               fstring tmp;
-               fstrcpy(tmp,p+1);
-               fstrcpy(tok[2],tmp);
+               tok[2] = p+1;
        }
 
        buf->job = atoi(tok[1]);
@@ -620,6 +656,7 @@ static bool parse_lpq_sysv(char *line,print_queue_struct *buf,bool first)
        buf->time = EntryTime(tok, 4, count, 7);
        fstrcpy(buf->fs_user,tok[2]);
        fstrcpy(buf->fs_file,tok[2]);
+       TALLOC_FREE(frame);
        return True;
 }
 
@@ -628,7 +665,7 @@ parse a lpq line
 
 here is an example of lpq output under qnx
 Spooler: /qnx/spooler, on node 1
-Printer: txt        (ready) 
+Printer: txt        (ready)
 0000:     root [job #1    ]   active 1146 bytes        /etc/profile
 0001:     root [job #2    ]    ready 2378 bytes        /etc/install
 0002:     root [job #3    ]    ready 1146 bytes        -- standard input --
@@ -636,9 +673,10 @@ Printer: txt        (ready)
 
 static bool parse_lpq_qnx(char *line,print_queue_struct *buf,bool first)
 {
-       fstring tok[7];
+       char *tok[7];
        int count=0;
        const char *cline = line;
+       TALLOC_CTX *frame = NULL;
 
        DEBUG(4,("antes [%s]\n", line));
 
@@ -653,30 +691,33 @@ static bool parse_lpq_qnx(char *line,print_queue_struct *buf,bool first)
        string_sub(line,"]","",0);
        DEBUG(4,("despues 2 [%s]\n", line));
 
-       for (count=0; count<7 && next_token(&cline,tok[count],NULL,sizeof(tok[count])); count++) {
+       frame = talloc_stackframe();
+       for (count=0; count<7 &&
+                       next_token_talloc(frame,&cline,&tok[count],NULL);
+                       count++) {
                ;
        }
 
        /* we must get 7 tokens */
        if (count < 7) {
+               TALLOC_FREE(frame);
                return False;
        }
 
        /* the 3rd and 5th columns must be integer */
        if (!isdigit((int)*tok[2]) || !isdigit((int)*tok[4])) {
+               TALLOC_FREE(frame);
                return False;
        }
 
        /* only take the last part of the filename */
        {
-               fstring tmp;
                char *p = strrchr_m(tok[6],'/');
                if (p) {
-                       fstrcpy(tmp,p+1);
-                       fstrcpy(tok[6],tmp);
+                       tok[6] = p+1;
                }
        }
-       
+
        buf->job = atoi(tok[2]);
        buf->size = atoi(tok[4]);
        buf->status = strequal(tok[3],"active")?LPQ_PRINTING:LPQ_QUEUED;
@@ -684,6 +725,7 @@ static bool parse_lpq_qnx(char *line,print_queue_struct *buf,bool first)
        buf->time = time(NULL);
        fstrcpy(buf->fs_user,tok[1]);
        fstrcpy(buf->fs_file,tok[6]);
+       TALLOC_FREE(frame);
        return True;
 }
 
@@ -703,37 +745,47 @@ Local  Printer 'lp2' (fjall):
 
 static bool parse_lpq_plp(char *line,print_queue_struct *buf,bool first)
 {
-       fstring tok[11];
+       char *tok[11];
        int count=0;
        const char *cline = line;
+       TALLOC_CTX *frame = talloc_stackframe();
 
        /* handle the case of "(standard input)" as a filename */
        string_sub(line,"stdin","STDIN",0);
        all_string_sub(line,"(","\"",0);
        all_string_sub(line,")","\"",0);
-  
-       for (count=0; count<11 && next_token(&cline,tok[count],NULL,sizeof(tok[count])); count++) {
+
+       for (count=0; count<11 &&
+                       next_token_talloc(frame,&cline,&tok[count],NULL);
+                       count++) {
                ;
        }
 
        /* we must get 11 tokens */
        if (count < 11) {
+               TALLOC_FREE(frame);
                return False;
        }
 
        /* the first must be "active" or begin with an integer */
        if (strcmp(tok[0],"active") && !isdigit((int)tok[0][0])) {
+               TALLOC_FREE(frame);
                return False;
        }
 
        /* the 5th and 8th must be integer */
        if (!isdigit((int)*tok[4]) || !isdigit((int)*tok[7])) {
+               TALLOC_FREE(frame);
                return False;
        }
 
        /* if the fname contains a space then use STDIN */
        if (strchr_m(tok[6],' ')) {
-               fstrcpy(tok[6],"STDIN");
+               tok[6] = talloc_strdup(frame, "STDIN");
+               if (!tok[6]) {
+                       TALLOC_FREE(frame);
+                       return false;
+               }
        }
 
        /* only take the last part of the filename */
@@ -761,6 +813,7 @@ static bool parse_lpq_plp(char *line,print_queue_struct *buf,bool first)
        buf->time = time(NULL);
        fstrcpy(buf->fs_user,tok[1]);
        fstrcpy(buf->fs_file,tok[6]);
+       TALLOC_FREE(frame);
        return True;
 }
 
@@ -944,16 +997,20 @@ parse a vlp line
 static bool parse_lpq_vlp(char *line,print_queue_struct *buf,bool first)
 {
        int toknum = 0;
-       fstring tok;
+       char *tok;
+       TALLOC_CTX *frame = talloc_stackframe();
        const char *cline = line;
 
        /* First line is printer status */
 
-       if (!isdigit(line[0])) return False;
+       if (!isdigit(line[0])) {
+               TALLOC_FREE(frame);
+               return False;
+       }
 
        /* Parse a print job entry */
 
-       while(next_token(&cline, tok, NULL, sizeof(fstring))) {
+       while(next_token_talloc(frame, &cline, &tok, NULL)) {
                switch (toknum) {
                case 0:
                        buf->job = atoi(tok);
@@ -977,6 +1034,7 @@ static bool parse_lpq_vlp(char *line,print_queue_struct *buf,bool first)
                toknum++;
        }
 
+       TALLOC_FREE(frame);
        return True;
 }
 
index 7c4ea18b1e60ec81e607207e7146781c126f338a..12a37d10a13fecb5d8e7e15e6e0b36eb2820b8b0 100644 (file)
@@ -89,7 +89,8 @@ static bool init_registry_data( void )
        char *base = NULL;
        char *remaining = NULL;
        TALLOC_CTX *ctx = talloc_tos();
-       fstring keyname, subkeyname;
+       char *keyname;
+       char *subkeyname;
        REGSUBKEY_CTR *subkeys;
        REGVAL_CTR *values;
        int i;
@@ -125,7 +126,7 @@ static bool init_registry_data( void )
                }
                p = path;
 
-               while (next_token(&p, keyname, "\\", sizeof(keyname))) {
+               while (next_token_talloc(ctx, &p, &keyname, "\\")) {
 
                        /* build up the registry path from the components */
 
@@ -142,7 +143,10 @@ static bool init_registry_data( void )
 
                        /* get the immediate subkeyname (if we have one ) */
 
-                       *subkeyname = '\0';
+                       subkeyname = talloc_strdup(ctx, "");
+                       if (!subkeyname) {
+                               goto fail;
+                       }
                        if (*p) {
                                TALLOC_FREE(remaining);
                                remaining = talloc_strdup(ctx, p);
@@ -151,9 +155,12 @@ static bool init_registry_data( void )
                                }
                                p2 = remaining;
 
-                               if (!next_token(&p2, subkeyname, "\\",
-                                                       sizeof(subkeyname))) {
-                                       fstrcpy( subkeyname, p2 );
+                               if (!next_token_talloc(ctx, &p2,
+                                                       &subkeyname, "\\")) {
+                                       subkeyname = talloc_strdup(ctx,p2);
+                                       if (!subkeyname) {
+                                               goto fail;
+                                       }
                                }
                        }
 
index df11c6d75aec41f5819471e52cfe99ad84c905e3..65607a4ac896a31c9b9d5f77a306b2817aea89c5 100644 (file)
@@ -1086,7 +1086,7 @@ bool net_io_r_srv_pwset(const char *desc, NET_R_SRV_PWSET *r_s, prs_struct *ps,
 static int init_dom_sid2s(TALLOC_CTX *ctx, const char *sids_str, DOM_SID2 **ppsids)
 {
        const char *ptr;
-       fstring s2;
+       char *s2;
        int count = 0;
 
        DEBUG(4,("init_dom_sid2s: %s\n", sids_str ? sids_str:""));
@@ -1096,9 +1096,11 @@ static int init_dom_sid2s(TALLOC_CTX *ctx, const char *sids_str, DOM_SID2 **ppsi
        if(sids_str) {
                int number;
                DOM_SID2 *sids;
+               TALLOC_CTX *frame = talloc_stackframe();
 
                /* Count the number of valid SIDs. */
-               for (count = 0, ptr = sids_str; next_token(&ptr, s2, NULL, sizeof(s2)); ) {
+               for (count = 0, ptr = sids_str;
+                               next_token_talloc(frame,&ptr, &s2, NULL); ) {
                        DOM_SID tmpsid;
                        if (string_to_sid(&tmpsid, s2))
                                count++;
@@ -1107,15 +1109,18 @@ static int init_dom_sid2s(TALLOC_CTX *ctx, const char *sids_str, DOM_SID2 **ppsi
                /* Now allocate space for them. */
                if (count) {
                        *ppsids = TALLOC_ZERO_ARRAY(ctx, DOM_SID2, count);
-                       if (*ppsids == NULL)
+                       if (*ppsids == NULL) {
+                               TALLOC_FREE(frame);
                                return 0;
+                       }
                } else {
                        *ppsids = NULL;
                }
 
                sids = *ppsids;
 
-               for (number = 0, ptr = sids_str; next_token(&ptr, s2, NULL, sizeof(s2)); ) {
+               for (number = 0, ptr = sids_str;
+                               next_token_talloc(frame, &ptr, &s2, NULL); ) {
                        DOM_SID tmpsid;
                        if (string_to_sid(&tmpsid, s2)) {
                                /* count only valid sids */
@@ -1123,6 +1128,7 @@ static int init_dom_sid2s(TALLOC_CTX *ctx, const char *sids_str, DOM_SID2 **ppsi
                                number++;
                        }
                }
+               TALLOC_FREE(frame);
        }
 
        return count;
index aef5adb72f361b45fbc320bcd7cc1683f5d23f63..5a1d71d2af806dd584af76bbfd559a0c809a362e 100644 (file)
@@ -304,34 +304,50 @@ static void pwd_sub(char *buf)
 
 static int talktochild(int master, const char *seq)
 {
+       TALLOC_CTX *frame = talloc_stackframe();
        int count = 0;
-       fstring issue, expected;
+       char *issue;
+       char *expected;
 
-       fstrcpy(issue, ".");
+       issue = talloc_strdup(frame, ".");
+       if (!issue) {
+               TALLOC_FREE(frame);
+               return false;
+       }
 
-       while (next_token(&seq, expected, NULL, sizeof(expected)))
-       {
+       while (next_token_talloc(frame, &seq, &expected, NULL)) {
                pwd_sub(expected);
                count++;
 
-               if (!expect(master, issue, expected))
-               {
+               if (!expect(master, issue, expected)) {
                        DEBUG(3, ("Response %d incorrect\n", count));
-                       return False;
+                       TALLOC_FREE(frame);
+                       return false;
                }
 
-               if (!next_token(&seq, issue, NULL, sizeof(issue)))
-                       fstrcpy(issue, ".");
-
+               if (!next_token_talloc(frame, &seq, &issue, NULL)) {
+                       issue = talloc_strdup(frame, ".");
+                       if (!issue) {
+                               TALLOC_FREE(frame);
+                               return false;
+                       }
+               }
                pwd_sub(issue);
        }
+
        if (!strequal(issue, ".")) {
                /* we have one final issue to send */
-               fstrcpy(expected, ".");
-               if (!expect(master, issue, expected))
+               expected = talloc_strdup(frame, ".");
+               if (!expected) {
+                       TALLOC_FREE(frame);
+                       return false;
+               }
+               if (!expect(master, issue, expected)) {
+                       TALLOC_FREE(frame);
                        return False;
+               }
        }
-
+       TALLOC_FREE(frame);
        return (count > 0);
 }
 
index b194fc623135ed2eb291b5ed3019019a885eb234..feb5fa4b05dcb2075a4da36a4467e5edd95c1d52 100644 (file)
@@ -1177,11 +1177,13 @@ static int get_server_info(uint32 servertype,
                struct srv_info_struct *s;
                const char *ptr = lines[i];
                bool ok = True;
+               TALLOC_CTX *frame = NULL;
+               char *p;
 
                if (!*ptr) {
                        continue;
                }
-    
+
                if (count == alloced) {
                        alloced += 10;
                        *servers = SMB_REALLOC_ARRAY(*servers,struct srv_info_struct, alloced);
@@ -1193,26 +1195,43 @@ static int get_server_info(uint32 servertype,
                        memset((char *)((*servers)+count),'\0',sizeof(**servers)*(alloced-count));
                }
                s = &(*servers)[count];
-    
-               if (!next_token(&ptr,s->name, NULL, sizeof(s->name))) {
+
+               frame = talloc_stackframe();
+               s->name[0] = '\0';
+               if (!next_token_talloc(frame,&ptr,&p, NULL)) {
+                       TALLOC_FREE(frame);
                        continue;
                }
-               if (!next_token(&ptr,stype, NULL, sizeof(stype))) {
+               fstrcpy(s->name, p);
+
+               stype[0] = '\0';
+               if (!next_token_talloc(frame,&ptr, &p, NULL)) {
+                       TALLOC_FREE(frame);
                        continue;
                }
-               if (!next_token(&ptr,s->comment, NULL, sizeof(s->comment))) {
+               fstrcpy(stype, p);
+
+               s->comment[0] = '\0';
+               if (!next_token_talloc(frame,&ptr, &p, NULL)) {
+                       TALLOC_FREE(frame);
                        continue;
                }
-               if (!next_token(&ptr,s->domain, NULL, sizeof(s->domain))) {
+               fstrcpy(s->comment, p);
+
+               s->domain[0] = '\0';
+               if (!next_token_talloc(frame,&ptr,&p, NULL)) {
                        /* this allows us to cope with an old nmbd */
-                       fstrcpy(s->domain,lp_workgroup()); 
+                       fstrcpy(s->domain,lp_workgroup());
+               } else {
+                       fstrcpy(s->domain, p);
                }
-    
-               if (sscanf(stype,"%X",&s->type) != 1) { 
-                       DEBUG(4,("r:host file ")); 
-                       ok = False; 
+               TALLOC_FREE(frame);
+
+               if (sscanf(stype,"%X",&s->type) != 1) {
+                       DEBUG(4,("r:host file "));
+                       ok = False;
                }
-    
+
                /* Filter the servers/domains we return based on what was asked for. */
 
                /* Check to see if we are being asked for a local list only. */
@@ -1222,11 +1241,11 @@ static int get_server_info(uint32 servertype,
                }
 
                /* doesn't match up: don't want it */
-               if (!(servertype & s->type)) { 
-                       DEBUG(4,("r:serv type ")); 
-                       ok = False; 
+               if (!(servertype & s->type)) {
+                       DEBUG(4,("r:serv type "));
+                       ok = False;
                }
-    
+
                if ((servertype & SV_TYPE_DOMAIN_ENUM) != 
                                (s->type & SV_TYPE_DOMAIN_ENUM)) {
                        DEBUG(4,("s: dom mismatch "));
index 328993f6b058305acc06ae7565e3b97f0a4a2690..6b1ab6ff179ca48337047f92d615ac39450d3312 100644 (file)
@@ -352,9 +352,10 @@ static bool open_sockets_smbd(bool is_daemon, bool interactive, const char *smb_
                /* Now open a listen socket for each of the
                   interfaces. */
                for(i = 0; i < num_interfaces; i++) {
+                       TALLOC_CTX *frame = NULL;
                        const struct sockaddr_storage *ifss =
                                        iface_n_sockaddr_storage(i);
-                       fstring tok;
+                       char *tok;
                        const char *ptr;
 
                        if (ifss == NULL) {
@@ -364,8 +365,9 @@ static bool open_sockets_smbd(bool is_daemon, bool interactive, const char *smb_
                                continue;
                        }
 
-                       for (ptr=ports; next_token(&ptr, tok, " \t,",
-                                               sizeof(tok)); ) {
+                       frame = talloc_stackframe();
+                       for (ptr=ports;
+                                       next_token_talloc(frame,&ptr, &tok, " \t,");) {
                                unsigned port = atoi(tok);
                                if (port == 0 || port > 0xffff) {
                                        continue;
@@ -389,6 +391,7 @@ static bool open_sockets_smbd(bool is_daemon, bool interactive, const char *smb_
                                        DEBUG(0,("open_sockets_smbd: listen: "
                                                "%s\n", strerror(errno)));
                                        close(s);
+                                       TALLOC_FREE(frame);
                                        return False;
                                }
                                FD_SET(s,&listen_set);
@@ -398,18 +401,21 @@ static bool open_sockets_smbd(bool is_daemon, bool interactive, const char *smb_
                                if (num_sockets >= FD_SETSIZE) {
                                        DEBUG(0,("open_sockets_smbd: Too "
                                                "many sockets to bind to\n"));
+                                       TALLOC_FREE(frame);
                                        return False;
                                }
                        }
+                       TALLOC_FREE(frame);
                }
        } else {
                /* Just bind to 0.0.0.0 - accept connections
                   from anywhere. */
 
-               fstring tok;
+               TALLOC_CTX *frame = talloc_stackframe();
+               char *tok;
                const char *ptr;
                const char *sock_addr = lp_socket_address();
-               fstring sock_tok;
+               char *sock_tok;
                const char *sock_ptr;
 
                if (strequal(sock_addr, "0.0.0.0") ||
@@ -421,10 +427,9 @@ static bool open_sockets_smbd(bool is_daemon, bool interactive, const char *smb_
 #endif
                }
 
-               for (sock_ptr=sock_addr; next_token(&sock_ptr, sock_tok, " \t,",
-                                       sizeof(sock_tok)); ) {
-                       for (ptr=ports; next_token(&ptr, tok, " \t,",
-                                               sizeof(tok)); ) {
+               for (sock_ptr=sock_addr;
+                               next_token_talloc(frame, &sock_ptr, &sock_tok, " \t,"); ) {
+                       for (ptr=ports; next_token_talloc(frame, &ptr, &tok, " \t,"); ) {
                                struct sockaddr_storage ss;
 
                                unsigned port = atoi(tok);
@@ -456,6 +461,7 @@ static bool open_sockets_smbd(bool is_daemon, bool interactive, const char *smb_
                                                "listen: %s\n",
                                                 strerror(errno)));
                                        close(s);
+                                       TALLOC_FREE(frame);
                                        return False;
                                }
 
@@ -468,10 +474,12 @@ static bool open_sockets_smbd(bool is_daemon, bool interactive, const char *smb_
                                if (num_sockets >= FD_SETSIZE) {
                                        DEBUG(0,("open_sockets_smbd: Too "
                                                "many sockets to bind to\n"));
+                                       TALLOC_FREE(frame);
                                        return False;
                                }
                        }
                }
+               TALLOC_FREE(frame);
        }
 
        SAFE_FREE(ports);
index b41142a087a1d4b2a700667510411b77e6c9a17a..3f78d6ced81e347ff534881878bee811333cf4c9 100644 (file)
@@ -4359,9 +4359,10 @@ static bool get_user_tokens(int *num_tokens, struct user_token **user_tokens)
        struct winbindd_request request;
        struct winbindd_response response;
        const char *extra_data;
-       fstring name;
+       char *name;
        int i;
        struct user_token *result;
+       TALLOC_CTX *frame = NULL;
 
        if (lp_winbind_use_default_domain() &&
            (opt_target_workgroup == NULL)) {
@@ -4374,7 +4375,7 @@ static bool get_user_tokens(int *num_tokens, struct user_token **user_tokens)
 
        ZERO_STRUCT(request);
        ZERO_STRUCT(response);
-       
+
        if (winbindd_request_response(WINBINDD_LIST_USERS, &request, &response) !=
            NSS_STATUS_SUCCESS)
                return False;
@@ -4387,7 +4388,8 @@ static bool get_user_tokens(int *num_tokens, struct user_token **user_tokens)
        extra_data = (const char *)response.extra_data.data;
        *num_tokens = 0;
 
-       while(next_token(&extra_data, name, ",", sizeof(fstring))) {
+       frame = talloc_stackframe();
+       while(next_token_talloc(frame, &extra_data, &name, ",")) {
                *num_tokens += 1;
        }
 
@@ -4395,14 +4397,14 @@ static bool get_user_tokens(int *num_tokens, struct user_token **user_tokens)
 
        if (result == NULL) {
                DEBUG(1, ("Could not malloc sid array\n"));
+               TALLOC_FREE(frame);
                return False;
        }
 
        extra_data = (const char *)response.extra_data.data;
        i=0;
 
-       while(next_token(&extra_data, name, ",", sizeof(fstring))) {
-
+       while(next_token_talloc(frame, &extra_data, &name, ",")) {
                fstring domain, user;
                char *p;
 
@@ -4425,7 +4427,7 @@ static bool get_user_tokens(int *num_tokens, struct user_token **user_tokens)
                get_user_sids(domain, user, &(result[i].token));
                i+=1;
        }
-       
+       TALLOC_FREE(frame);
        SAFE_FREE(response.extra_data.data);
 
        *user_tokens = result;
index d40b953707ddb7e84c40f3027914d7ed0022001e..bcfb37713c9265a152ebe9b5fd5d41d407fe2551 100644 (file)
@@ -514,17 +514,17 @@ static NTSTATUS net_copy_driverfile(TALLOC_CTX *mem_ctx,
        const char *p;
        char *src_name;
        char *dst_name;
-       fstring version;
-       fstring filename;
-       fstring tok;
+       char *version;
+       char *filename;
+       char *tok;
 
        /* scroll through the file until we have the part 
           beyond archi_table.short_archi */
        p = file;
-       while (next_token(&p, tok, "\\", sizeof(tok))) {
+       while (next_token_talloc(mem_ctx, &p, &tok, "\\")) {
                if (strequal(tok, short_archi)) {
-                       next_token(&p, version, "\\", sizeof(version));
-                       next_token(&p, filename, "\\", sizeof(filename));
+                       next_token_talloc(mem_ctx, &p, &version, "\\");
+                       next_token_talloc(mem_ctx, &p, &filename, "\\");
                }
        }
 
index e03222b005bde4ba44424056e6d80a0071a43755..cd2c78f8f3264f4da1bea88e524047876235577c 100644 (file)
@@ -148,7 +148,7 @@ static bool parse_ace(SEC_ACE *ace, const char *orig_str)
 {
        char *p;
        const char *cp;
-       fstring tok;
+       char *tok;
        unsigned int atype = 0;
        unsigned int aflags = 0;
        unsigned int amask = 0;
@@ -156,8 +156,10 @@ static bool parse_ace(SEC_ACE *ace, const char *orig_str)
        SEC_ACCESS mask;
        const struct perm_value *v;
        char *str = SMB_STRDUP(orig_str);
+       TALLOC_CTX *frame = talloc_stackframe();
 
        if (!str) {
+               TALLOC_FREE(frame);
                return False;
        }
 
@@ -166,6 +168,7 @@ static bool parse_ace(SEC_ACE *ace, const char *orig_str)
        if (!p) {
                printf("ACE '%s': missing ':'.\n", orig_str);
                SAFE_FREE(str);
+               TALLOC_FREE(frame);
                return False;
        }
        *p = '\0';
@@ -183,14 +186,16 @@ static bool parse_ace(SEC_ACE *ace, const char *orig_str)
                printf("ACE '%s': failed to convert '%s' to SID\n",
                        orig_str, str);
                SAFE_FREE(str);
+               TALLOC_FREE(frame);
                return False;
        }
 
        cp = p;
-       if (!next_token(&cp, tok, "/", sizeof(fstring))) {
+       if (!next_token_talloc(frame, &cp, &tok, "/")) {
                printf("ACE '%s': failed to find '/' character.\n",
                        orig_str);
                SAFE_FREE(str);
+               TALLOC_FREE(frame);
                return False;
        }
 
@@ -202,24 +207,27 @@ static bool parse_ace(SEC_ACE *ace, const char *orig_str)
                printf("ACE '%s': missing 'ALLOWED' or 'DENIED' entry at '%s'\n",
                        orig_str, tok);
                SAFE_FREE(str);
+               TALLOC_FREE(frame);
                return False;
        }
 
        /* Only numeric form accepted for flags at present */
        /* no flags on share permissions */
 
-       if (!(next_token(&cp, tok, "/", sizeof(fstring)) &&
+       if (!(next_token_talloc(frame, &cp, &tok, "/") &&
              sscanf(tok, "%i", &aflags) && aflags == 0)) {
                printf("ACE '%s': bad integer flags entry at '%s'\n",
                        orig_str, tok);
                SAFE_FREE(str);
+               TALLOC_FREE(frame);
                return False;
        }
 
-       if (!next_token(&cp, tok, "/", sizeof(fstring))) {
+       if (!next_token_talloc(frame, &cp, &tok, "/")) {
                printf("ACE '%s': missing / at '%s'\n",
                        orig_str, tok);
                SAFE_FREE(str);
+               TALLOC_FREE(frame);
                return False;
        }
 
@@ -227,6 +235,7 @@ static bool parse_ace(SEC_ACE *ace, const char *orig_str)
                if (sscanf(tok, "%i", &amask) != 1) {
                        printf("ACE '%s': bad hex number at '%s'\n",
                                orig_str, tok);
+                       TALLOC_FREE(frame);
                        SAFE_FREE(str);
                        return False;
                }
@@ -255,6 +264,7 @@ static bool parse_ace(SEC_ACE *ace, const char *orig_str)
                if (!found) {
                        printf("ACE '%s': bad permission value at '%s'\n",
                                orig_str, p);
+                       TALLOC_FREE(frame);
                        SAFE_FREE(str);
                        return False;
                }
@@ -262,6 +272,7 @@ static bool parse_ace(SEC_ACE *ace, const char *orig_str)
        }
 
        if (*p) {
+               TALLOC_FREE(frame);
                SAFE_FREE(str);
                return False;
        }
@@ -270,6 +281,7 @@ static bool parse_ace(SEC_ACE *ace, const char *orig_str)
        mask = amask;
        init_sec_ace(ace, &sid, atype, mask, aflags);
        SAFE_FREE(str);
+       TALLOC_FREE(frame);
        return True;
 }
 
index 1057d35db379334ad5afe2cf6e51701d67851395..e5ba8e5d0b3b8c35266ce692fcd4f3f169832634 100644 (file)
@@ -272,7 +272,7 @@ static bool parse_ace(struct cli_state *cli, SEC_ACE *ace,
 {
        char *p;
        const char *cp;
-       fstring tok;
+       char *tok;
        unsigned int atype = 0;
        unsigned int aflags = 0;
        unsigned int amask = 0;
@@ -280,8 +280,10 @@ static bool parse_ace(struct cli_state *cli, SEC_ACE *ace,
        SEC_ACCESS mask;
        const struct perm_value *v;
        char *str = SMB_STRDUP(orig_str);
+       TALLOC_CTX *frame = talloc_stackframe();
 
        if (!str) {
+               TALLOC_FREE(frame);
                return False;
        }
 
@@ -290,6 +292,7 @@ static bool parse_ace(struct cli_state *cli, SEC_ACE *ace,
        if (!p) {
                printf("ACE '%s': missing ':'.\n", orig_str);
                SAFE_FREE(str);
+               TALLOC_FREE(frame);
                return False;
        }
        *p = '\0';
@@ -307,14 +310,16 @@ static bool parse_ace(struct cli_state *cli, SEC_ACE *ace,
                printf("ACE '%s': failed to convert '%s' to SID\n",
                        orig_str, str);
                SAFE_FREE(str);
+               TALLOC_FREE(frame);
                return False;
        }
 
        cp = p;
-       if (!next_token(&cp, tok, "/", sizeof(fstring))) {
+       if (!next_token_talloc(frame, &cp, &tok, "/")) {
                printf("ACE '%s': failed to find '/' character.\n",
                        orig_str);
                SAFE_FREE(str);
+               TALLOC_FREE(frame);
                return False;
        }
 
@@ -326,23 +331,26 @@ static bool parse_ace(struct cli_state *cli, SEC_ACE *ace,
                printf("ACE '%s': missing 'ALLOWED' or 'DENIED' entry at '%s'\n",
                        orig_str, tok);
                SAFE_FREE(str);
+               TALLOC_FREE(frame);
                return False;
        }
 
        /* Only numeric form accepted for flags at present */
 
-       if (!(next_token(&cp, tok, "/", sizeof(fstring)) &&
+       if (!(next_token_talloc(frame, &cp, &tok, "/") &&
              sscanf(tok, "%i", &aflags))) {
                printf("ACE '%s': bad integer flags entry at '%s'\n",
                        orig_str, tok);
                SAFE_FREE(str);
+               TALLOC_FREE(frame);
                return False;
        }
 
-       if (!next_token(&cp, tok, "/", sizeof(fstring))) {
+       if (!next_token_talloc(frame, &cp, &tok, "/")) {
                printf("ACE '%s': missing / at '%s'\n",
                        orig_str, tok);
                SAFE_FREE(str);
+               TALLOC_FREE(frame);
                return False;
        }
 
@@ -351,6 +359,7 @@ static bool parse_ace(struct cli_state *cli, SEC_ACE *ace,
                        printf("ACE '%s': bad hex number at '%s'\n",
                                orig_str, tok);
                        SAFE_FREE(str);
+                       TALLOC_FREE(frame);
                        return False;
                }
                goto done;
@@ -379,12 +388,14 @@ static bool parse_ace(struct cli_state *cli, SEC_ACE *ace,
                        printf("ACE '%s': bad permission value at '%s'\n",
                                orig_str, p);
                        SAFE_FREE(str);
+                       TALLOC_FREE(frame);
                        return False;
                }
                p++;
        }
 
        if (*p) {
+               TALLOC_FREE(frame);
                SAFE_FREE(str);
                return False;
        }
@@ -392,6 +403,7 @@ static bool parse_ace(struct cli_state *cli, SEC_ACE *ace,
  done:
        mask = amask;
        init_sec_ace(ace, &sid, atype, mask, aflags);
+       TALLOC_FREE(frame);
        SAFE_FREE(str);
        return True;
 }
@@ -418,18 +430,17 @@ static bool add_ace(SEC_ACL **the_acl, SEC_ACE *ace)
 }
 
 /* parse a ascii version of a security descriptor */
-static SEC_DESC *sec_desc_parse(struct cli_state *cli, char *str)
+static SEC_DESC *sec_desc_parse(TALLOC_CTX *ctx, struct cli_state *cli, char *str)
 {
        const char *p = str;
-       fstring tok;
+       char *tok;
        SEC_DESC *ret = NULL;
        size_t sd_size;
        DOM_SID *grp_sid=NULL, *owner_sid=NULL;
        SEC_ACL *dacl=NULL;
        int revision=1;
 
-       while (next_token(&p, tok, "\t,\r\n", sizeof(tok))) {
-
+       while (next_token_talloc(ctx, &p, &tok, "\t,\r\n")) {
                if (strncmp(tok,"REVISION:", 9) == 0) {
                        revision = strtol(tok+9, NULL, 16);
                        continue;
@@ -479,7 +490,7 @@ static SEC_DESC *sec_desc_parse(struct cli_state *cli, char *str)
                goto done;
        }
 
-       ret = make_sec_desc(talloc_tos(),revision, SEC_DESC_SELF_RELATIVE, owner_sid, grp_sid,
+       ret = make_sec_desc(ctx,revision, SEC_DESC_SELF_RELATIVE, owner_sid, grp_sid,
                            NULL, dacl, &sd_size);
 
   done:
@@ -677,7 +688,7 @@ static int cacl_set(struct cli_state *cli, char *filename,
        size_t sd_size;
        int result = EXIT_OK;
 
-       sd = sec_desc_parse(cli, the_acl);
+       sd = sec_desc_parse(talloc_tos(), cli, the_acl);
 
        if (!sd) return EXIT_PARSE_ERROR;
        if (test_args) return EXIT_OK;
index 4b052a8576dc66ea1795ba5ae161ceb98065bc75..4eda0fcada4b4c8d0c7f3fdbd544d3c666a756e1 100644 (file)
@@ -222,9 +222,9 @@ static NTSTATUS append_afs_token(TALLOC_CTX *mem_ctx,
        return NT_STATUS_OK;
 }
 
-static NTSTATUS check_info3_in_group(TALLOC_CTX *mem_ctx, 
+static NTSTATUS check_info3_in_group(TALLOC_CTX *mem_ctx,
                                     NET_USER_INFO_3 *info3,
-                                    const char *group_sid) 
+                                    const char *group_sid)
 /**
  * Check whether a user belongs to a group or list of groups.
  *
@@ -239,15 +239,16 @@ static NTSTATUS check_info3_in_group(TALLOC_CTX *mem_ctx,
 {
        DOM_SID *require_membership_of_sid;
        size_t num_require_membership_of_sid;
-       fstring req_sid;
+       char *req_sid;
        const char *p;
        DOM_SID sid;
        size_t i;
        struct nt_user_token *token;
+       TALLOC_CTX *frame = NULL;
        NTSTATUS status;
 
        /* Parse the 'required group' SID */
-       
+
        if (!group_sid || !group_sid[0]) {
                /* NO sid supplied, all users may access */
                return NT_STATUS_OK;
@@ -263,10 +264,12 @@ static NTSTATUS check_info3_in_group(TALLOC_CTX *mem_ctx,
 
        p = group_sid;
 
-       while (next_token(&p, req_sid, ",", sizeof(req_sid))) {
+       frame = talloc_stackframe();
+       while (next_token_talloc(frame, &p, &req_sid, ",")) {
                if (!string_to_sid(&sid, req_sid)) {
                        DEBUG(0, ("check_info3_in_group: could not parse %s "
                                  "as a SID!", req_sid));
+                       TALLOC_FREE(frame);
                        return NT_STATUS_INVALID_PARAMETER;
                }
 
@@ -274,10 +277,13 @@ static NTSTATUS check_info3_in_group(TALLOC_CTX *mem_ctx,
                                      &require_membership_of_sid,
                                      &num_require_membership_of_sid)) {
                        DEBUG(0, ("add_sid_to_array failed\n"));
+                       TALLOC_FREE(frame);
                        return NT_STATUS_NO_MEMORY;
                }
        }
 
+       TALLOC_FREE(frame);
+
        status = sid_array_from_info3(mem_ctx, info3, 
                                      &token->user_sids, 
                                      &token->num_sids,