diff options
author | Jim McDonough <jmcd@samba.org> | 2005-10-20 15:09:41 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 11:05:07 -0500 |
commit | 87d6e590f261ca6137fcaa115fcb5d6b00ed447e (patch) | |
tree | 2b27ea058d76db7dd0c0d0d47f54a1316caa04e6 | |
parent | f1195329a7f4401af730033c4d8d5570b42c2780 (diff) | |
download | samba-87d6e590f261ca6137fcaa115fcb5d6b00ed447e.tar.gz samba-87d6e590f261ca6137fcaa115fcb5d6b00ed447e.tar.bz2 samba-87d6e590f261ca6137fcaa115fcb5d6b00ed447e.zip |
r11228: Speed up string_to_sid by removing next_token calls, thus eliminating
the need for allocating memory to duplicate the string.
(This used to be commit e5cc94f13ff2dacb219c8a56fa13853d620ecda6)
-rw-r--r-- | source3/lib/util_sid.c | 61 |
1 files changed, 27 insertions, 34 deletions
diff --git a/source3/lib/util_sid.c b/source3/lib/util_sid.c index f3f6c938ee..cc1f55330f 100644 --- a/source3/lib/util_sid.c +++ b/source3/lib/util_sid.c @@ -6,6 +6,7 @@ Copyright (C) Jeremy Allison 1999 Copyright (C) Stefan (metze) Metzmacher 2002 Copyright (C) Simo Sorce 2002 + Copyright (C) Jim McDonough <jmcd@us.ibm.com> 2005 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -256,63 +257,55 @@ const char *sid_string_static(const DOM_SID *sid) BOOL string_to_sid(DOM_SID *sidout, const char *sidstr) { - pstring tok; - char *q; const char *p; + char *q; /* BIG NOTE: this function only does SIDS where the identauth is not >= 2^32 */ - uint32 ia; + uint32 conv; if (StrnCaseCmp( sidstr, "S-", 2)) { DEBUG(0,("string_to_sid: Sid %s does not start with 'S-'.\n", sidstr)); return False; } - memset((char *)sidout, '\0', sizeof(DOM_SID)); + ZERO_STRUCTP(sidout); - p = q = SMB_STRDUP(sidstr + 2); - if (p == NULL) { - DEBUG(0, ("string_to_sid: out of memory!\n")); - return False; - } - - if (!next_token(&p, tok, "-", sizeof(tok))) { + /* Get the revision number. */ + p = sidstr + 2; + conv = (uint32) strtoul(p, &q, 10); + if (!q || (*q != '-')) { DEBUG(0,("string_to_sid: Sid %s is not in a valid format.\n", sidstr)); - SAFE_FREE(q); return False; } + sidout->sid_rev_num = (uint8) conv; + q++; - /* Get the revision number. */ - sidout->sid_rev_num = (uint8)strtoul(tok, NULL, 10); - - if (!next_token(&p, tok, "-", sizeof(tok))) { + /* get identauth */ + conv = (uint32) strtoul(q, &q, 10); + if (!q || (*q != '-')) { DEBUG(0,("string_to_sid: Sid %s is not in a valid format.\n", sidstr)); - SAFE_FREE(q); return False; } - /* identauth in decimal should be < 2^32 */ - ia = (uint32)strtoul(tok, NULL, 10); - - /* NOTE - the ia value is in big-endian format. */ + /* NOTE - the conv value is in big-endian format. */ sidout->id_auth[0] = 0; sidout->id_auth[1] = 0; - sidout->id_auth[2] = (ia & 0xff000000) >> 24; - sidout->id_auth[3] = (ia & 0x00ff0000) >> 16; - sidout->id_auth[4] = (ia & 0x0000ff00) >> 8; - sidout->id_auth[5] = (ia & 0x000000ff); + sidout->id_auth[2] = (conv & 0xff000000) >> 24; + sidout->id_auth[3] = (conv & 0x00ff0000) >> 16; + sidout->id_auth[4] = (conv & 0x0000ff00) >> 8; + sidout->id_auth[5] = (conv & 0x000000ff); + q++; sidout->num_auths = 0; - while(next_token(&p, tok, "-", sizeof(tok)) && - sidout->num_auths < MAXSUBAUTHS) { - /* - * NOTE - the subauths are in native machine-endian format. They - * are converted to little-endian when linearized onto the wire. - */ - sid_append_rid(sidout, (uint32)strtoul(tok, NULL, 10)); + for(conv = (uint32) strtoul(q, &q, 10); + q && (*q =='-' || *q =='\0') && (sidout->num_auths < MAXSUBAUTHS); + conv = (uint32) strtoul(q, &q, 10)) { + sid_append_rid(sidout, conv); + if (*q == '\0') + break; + q++; } - - SAFE_FREE(q); + return True; } |