1
0
mirror of https://github.com/samba-team/samba.git synced 2025-11-29 16:23:52 +03:00

r11228: Speed up string_to_sid by removing next_token calls, thus eliminating

the need for allocating memory to duplicate the string.
This commit is contained in:
Jim McDonough
2005-10-20 15:09:41 +00:00
committed by Gerald (Jerry) Carter
parent 34c3fd77b3
commit e5cc94f13f

View File

@@ -6,6 +6,7 @@
Copyright (C) Jeremy Allison 1999 Copyright (C) Jeremy Allison 1999
Copyright (C) Stefan (metze) Metzmacher 2002 Copyright (C) Stefan (metze) Metzmacher 2002
Copyright (C) Simo Sorce 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 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 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) BOOL string_to_sid(DOM_SID *sidout, const char *sidstr)
{ {
pstring tok;
char *q;
const char *p; const char *p;
char *q;
/* BIG NOTE: this function only does SIDS where the identauth is not >= 2^32 */ /* BIG NOTE: this function only does SIDS where the identauth is not >= 2^32 */
uint32 ia; uint32 conv;
if (StrnCaseCmp( sidstr, "S-", 2)) { if (StrnCaseCmp( sidstr, "S-", 2)) {
DEBUG(0,("string_to_sid: Sid %s does not start with 'S-'.\n", sidstr)); DEBUG(0,("string_to_sid: Sid %s does not start with 'S-'.\n", sidstr));
return False; 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))) {
DEBUG(0,("string_to_sid: Sid %s is not in a valid format.\n", sidstr));
SAFE_FREE(q);
return False;
}
/* Get the revision number. */ /* Get the revision number. */
sidout->sid_rev_num = (uint8)strtoul(tok, NULL, 10); p = sidstr + 2;
conv = (uint32) strtoul(p, &q, 10);
if (!next_token(&p, tok, "-", sizeof(tok))) { if (!q || (*q != '-')) {
DEBUG(0,("string_to_sid: Sid %s is not in a valid format.\n", sidstr)); DEBUG(0,("string_to_sid: Sid %s is not in a valid format.\n", sidstr));
SAFE_FREE(q);
return False; return False;
} }
sidout->sid_rev_num = (uint8) conv;
q++;
/* 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));
return False;
}
/* identauth in decimal should be < 2^32 */ /* identauth in decimal should be < 2^32 */
ia = (uint32)strtoul(tok, NULL, 10); /* NOTE - the conv value is in big-endian format. */
/* NOTE - the ia value is in big-endian format. */
sidout->id_auth[0] = 0; sidout->id_auth[0] = 0;
sidout->id_auth[1] = 0; sidout->id_auth[1] = 0;
sidout->id_auth[2] = (ia & 0xff000000) >> 24; sidout->id_auth[2] = (conv & 0xff000000) >> 24;
sidout->id_auth[3] = (ia & 0x00ff0000) >> 16; sidout->id_auth[3] = (conv & 0x00ff0000) >> 16;
sidout->id_auth[4] = (ia & 0x0000ff00) >> 8; sidout->id_auth[4] = (conv & 0x0000ff00) >> 8;
sidout->id_auth[5] = (ia & 0x000000ff); sidout->id_auth[5] = (conv & 0x000000ff);
q++;
sidout->num_auths = 0; sidout->num_auths = 0;
while(next_token(&p, tok, "-", sizeof(tok)) && for(conv = (uint32) strtoul(q, &q, 10);
sidout->num_auths < MAXSUBAUTHS) { q && (*q =='-' || *q =='\0') && (sidout->num_auths < MAXSUBAUTHS);
/* conv = (uint32) strtoul(q, &q, 10)) {
* NOTE - the subauths are in native machine-endian format. They sid_append_rid(sidout, conv);
* are converted to little-endian when linearized onto the wire. if (*q == '\0')
*/ break;
sid_append_rid(sidout, (uint32)strtoul(tok, NULL, 10)); q++;
} }
SAFE_FREE(q);
return True; return True;
} }