Return-Path: Delivered-To: apmail-apr-cvs-archive@apr.apache.org Received: (qmail 59373 invoked by uid 500); 10 Jun 2001 19:34:28 -0000 Mailing-List: contact cvs-help@apr.apache.org; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: Reply-To: dev@apr.apache.org Delivered-To: mailing list cvs@apr.apache.org Received: (qmail 59362 invoked by uid 1134); 10 Jun 2001 19:34:27 -0000 Date: 10 Jun 2001 19:34:27 -0000 Message-ID: <20010610193427.59361.qmail@apache.org> From: wrowe@apache.org To: apr-cvs@apache.org Subject: cvs commit: apr/user/win32 userinfo.c wrowe 01/06/10 12:34:27 Modified: user/win32 userinfo.c Log: Solve two flukes. First, I mis-constructed the sid authority. Second, if the LookupAccountName call has to resolve the domain (e.g., lookup user joe), it must have a domain buffer or we segfault. Revision Changes Path 1.10 +15 -10 apr/user/win32/userinfo.c Index: userinfo.c =================================================================== RCS file: /home/cvs/apr/user/win32/userinfo.c,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- userinfo.c 2001/06/10 17:23:00 1.9 +++ userinfo.c 2001/06/10 19:34:27 1.10 @@ -78,9 +78,9 @@ * and NT records the value as hex if the value is > 2^32.) */ psia = GetSidIdentifierAuthority(id); - nsa = (DWORD)psia->Value[5] + (DWORD)psia->Value[4] << 8 + - (DWORD)psia->Value[3] << 16 + (DWORD)psia->Value[2] << 24; - sa = (DWORD)psia->Value[1] + (DWORD)psia->Value[0] << 8; + nsa = (DWORD)(psia->Value[5]) + ((DWORD)(psia->Value[4]) << 8) + + ((DWORD)(psia->Value[3])) << 16 + ((DWORD)(psia->Value[2]) << 24); + sa = (DWORD)(psia->Value[1]) + ((DWORD)(psia->Value[0]) << 8); if (sa) { slen = apr_snprintf(buf, blen, "S-%lu-0x%04x%08x", SID_REVISION, sa, nsa); @@ -190,8 +190,11 @@ const char *username, apr_pool_t *p) { SID_NAME_USE sidtype; - char *domain = NULL; - DWORD sidlen, rv; + char anydomain[256]; + char *domain; + DWORD sidlen = 0; + DWORD domlen = sizeof(anydomain); + DWORD rv; char *pos; if (pos = strchr(username, '/')) { @@ -202,19 +205,21 @@ domain = apr_pstrndup(p, username, pos - username); username = pos + 1; } + else { + domain = NULL; + } /* Get nothing on the first pass ... need to size the sid buffer */ - sidlen = LookupAccountName(domain, username, NULL, NULL, - NULL, NULL, &sidtype); + rv = LookupAccountName(domain, username, domain, &sidlen, + anydomain, &domlen, &sidtype); if (sidlen) { /* Give it back on the second pass */ *uid = apr_palloc(p, sidlen); + domlen = sizeof(anydomain); rv = LookupAccountName(domain, username, *uid, &sidlen, - NULL, NULL, &sidtype); + anydomain, &domlen, &sidtype); } - else - rv = 0; /* Quiet the compiler */ if (!sidlen || !rv) { return apr_get_os_error(); }