From: Hans Leidekker hans@codeweavers.com
--- dlls/secur32/negotiate.c | 69 +++++++++++----------------------------- 1 file changed, 19 insertions(+), 50 deletions(-)
diff --git a/dlls/secur32/negotiate.c b/dlls/secur32/negotiate.c index d01419ce9c7..a63e458750f 100644 --- a/dlls/secur32/negotiate.c +++ b/dlls/secur32/negotiate.c @@ -117,8 +117,9 @@ static SECURITY_STATUS SEC_ENTRY nego_AcquireCredentialsHandleA( PVOID pGetKeyArgument, PCredHandle phCredential, PTimeStamp ptsExpiry ) { SECURITY_STATUS ret = SEC_E_INSUFFICIENT_MEMORY; - SEC_WCHAR *user = NULL, *domain = NULL, *passwd = NULL, *package = NULL; - SEC_WINNT_AUTH_IDENTITY_W *identityW = NULL; + SEC_WCHAR *package = NULL; + SEC_WINNT_AUTH_IDENTITY_A *id = pAuthData; + SEC_WINNT_AUTH_IDENTITY_W idW = {};
TRACE("%s, %s, 0x%08lx, %p, %p, %p, %p, %p, %p\n", debugstr_a(pszPrincipal), debugstr_a(pszPackage), fCredentialUse, @@ -130,60 +131,28 @@ static SECURITY_STATUS SEC_ENTRY nego_AcquireCredentialsHandleA( if (!(package = malloc( package_len * sizeof(SEC_WCHAR) ))) return SEC_E_INSUFFICIENT_MEMORY; MultiByteToWideChar( CP_ACP, 0, pszPackage, -1, package, package_len ); } - if (pAuthData) + if (id && id->Flags == SEC_WINNT_AUTH_IDENTITY_ANSI) { - SEC_WINNT_AUTH_IDENTITY_A *identity = pAuthData; - int user_len, domain_len, passwd_len; + idW.UserLength = MultiByteToWideChar( CP_ACP, 0, (const char *)id->User, id->UserLength, NULL, 0 ); + if (!(idW.User = malloc( idW.UserLength * sizeof(SEC_WCHAR) ))) goto done; + MultiByteToWideChar( CP_ACP, 0, (const char *)id->User, id->UserLength, idW.User, idW.UserLength );
- if (identity->Flags == SEC_WINNT_AUTH_IDENTITY_ANSI) - { - if (!(identityW = malloc( sizeof(*identityW) ))) goto done; - - if (!identity->UserLength) user_len = 0; - else - { - user_len = MultiByteToWideChar( CP_ACP, 0, (LPCSTR)identity->User, - identity->UserLength, NULL, 0 ); - if (!(user = malloc( user_len * sizeof(SEC_WCHAR) ))) goto done; - MultiByteToWideChar( CP_ACP, 0, (LPCSTR)identity->User, identity->UserLength, - user, user_len ); - } - if (!identity->DomainLength) domain_len = 0; - else - { - domain_len = MultiByteToWideChar( CP_ACP, 0, (LPCSTR)identity->Domain, - identity->DomainLength, NULL, 0 ); - if (!(domain = malloc( domain_len * sizeof(SEC_WCHAR) ))) goto done; - MultiByteToWideChar( CP_ACP, 0, (LPCSTR)identity->Domain, identity->DomainLength, - domain, domain_len ); - } - if (!identity->PasswordLength) passwd_len = 0; - else - { - passwd_len = MultiByteToWideChar( CP_ACP, 0, (LPCSTR)identity->Password, - identity->PasswordLength, NULL, 0 ); - if (!(passwd = malloc( passwd_len * sizeof(SEC_WCHAR) ))) goto done; - MultiByteToWideChar( CP_ACP, 0, (LPCSTR)identity->Password, identity->PasswordLength, - passwd, passwd_len ); - } - identityW->Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE; - identityW->User = user; - identityW->UserLength = user_len; - identityW->Domain = domain; - identityW->DomainLength = domain_len; - identityW->Password = passwd; - identityW->PasswordLength = passwd_len; - } - else identityW = (SEC_WINNT_AUTH_IDENTITY_W *)identity; + idW.DomainLength = MultiByteToWideChar( CP_ACP, 0, (const char *)id->Domain, id->DomainLength, NULL, 0 ); + if (!(idW.Domain = malloc( idW.DomainLength * sizeof(SEC_WCHAR) ))) goto done; + MultiByteToWideChar( CP_ACP, 0, (const char *)id->Domain, id->DomainLength, idW.Domain, idW.DomainLength ); + + idW.PasswordLength = MultiByteToWideChar( CP_ACP, 0, (const char *)id->Password, id->PasswordLength, NULL, 0 ); + if (!(idW.Password = malloc( idW.PasswordLength * sizeof(SEC_WCHAR) ))) goto done; + MultiByteToWideChar( CP_ACP, 0, (const char *)id->Password, id->PasswordLength, idW.Password, idW.PasswordLength ); + + idW.Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE; + pAuthData = &idW; } - ret = nego_AcquireCredentialsHandleW( NULL, package, fCredentialUse, pLogonID, identityW, + + ret = nego_AcquireCredentialsHandleW( NULL, package, fCredentialUse, pLogonID, pAuthData, pGetKeyFn, pGetKeyArgument, phCredential, ptsExpiry ); done: free( package ); - free( user ); - free( domain ); - free( passwd ); - free( identityW ); return ret; }
From: Hans Leidekker hans@codeweavers.com
--- dlls/secur32/lsa.c | 68 ++++++++++++++++++---------------------------- 1 file changed, 27 insertions(+), 41 deletions(-)
diff --git a/dlls/secur32/lsa.c b/dlls/secur32/lsa.c index f69a2a74511..9368d3728e4 100644 --- a/dlls/secur32/lsa.c +++ b/dlls/secur32/lsa.c @@ -349,13 +349,12 @@ static SECURITY_STATUS WINAPI lsa_AcquireCredentialsHandleA( void *get_key_arg, CredHandle *credential, TimeStamp *ts_expiry) { SECURITY_STATUS status = SEC_E_INSUFFICIENT_MEMORY; - int len_user = 0, len_domain = 0, len_passwd = 0; - SEC_WCHAR *principalW = NULL, *packageW = NULL, *user = NULL, *domain = NULL, *passwd = NULL; - SEC_WINNT_AUTH_IDENTITY_W *auth_dataW = NULL; - SEC_WINNT_AUTH_IDENTITY_A *id = NULL; + SEC_WCHAR *principalW = NULL, *packageW = NULL; + SEC_WINNT_AUTH_IDENTITY_A *id = auth_data; + SEC_WINNT_AUTH_IDENTITY_W idW = {};
TRACE("%s %s %#lx %p %p %p %p %p\n", debugstr_a(principal), debugstr_a(package), - credentials_use, auth_data, get_key_fn, get_key_arg, credential, ts_expiry); + credentials_use, auth_data, get_key_fn, get_key_arg, credential, ts_expiry);
if (principal) { @@ -369,51 +368,38 @@ static SECURITY_STATUS WINAPI lsa_AcquireCredentialsHandleA( if (!(packageW = malloc( len * sizeof(SEC_WCHAR) ))) goto done; MultiByteToWideChar( CP_ACP, 0, package, -1, packageW, len ); } - if (auth_data) + if (id && (id->Flags == SEC_WINNT_AUTH_IDENTITY_ANSI)) { - id = (PSEC_WINNT_AUTH_IDENTITY_A)auth_data; - - if (id->Flags == SEC_WINNT_AUTH_IDENTITY_ANSI) + if (id->UserLength) { - if (!(auth_dataW = malloc( sizeof(SEC_WINNT_AUTH_IDENTITY_W) ))) goto done; - if (id->UserLength) - { - len_user = MultiByteToWideChar( CP_ACP, 0, (char *)id->User, id->UserLength, NULL, 0 ); - if (!(user = malloc( len_user * sizeof(SEC_WCHAR) ))) goto done; - MultiByteToWideChar( CP_ACP, 0, (char *)id->User, id->UserLength, user, len_user ); - } - if (id->DomainLength) - { - len_domain = MultiByteToWideChar( CP_ACP, 0, (char *)id->Domain, id->DomainLength, NULL, 0 ); - if (!(domain = malloc( len_domain * sizeof(SEC_WCHAR) ))) goto done; - MultiByteToWideChar( CP_ACP, 0, (char *)id->Domain, id->DomainLength, domain, len_domain ); - } - if (id->PasswordLength) - { - len_passwd = MultiByteToWideChar( CP_ACP, 0, (char *)id->Password, id->PasswordLength, NULL, 0 ); - if (!(passwd = malloc( len_passwd * sizeof(SEC_WCHAR) ))) goto done; - MultiByteToWideChar( CP_ACP, 0, (char *)id->Password, id->PasswordLength, passwd, len_passwd ); - } - auth_dataW->Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE; - auth_dataW->User = user; - auth_dataW->UserLength = len_user; - auth_dataW->Domain = domain; - auth_dataW->DomainLength = len_domain; - auth_dataW->Password = passwd; - auth_dataW->PasswordLength = len_passwd; + idW.UserLength = MultiByteToWideChar( CP_ACP, 0, (char *)id->User, id->UserLength, NULL, 0 ); + if (!(idW.User = malloc( idW.UserLength * sizeof(SEC_WCHAR) ))) goto done; + MultiByteToWideChar( CP_ACP, 0, (char *)id->User, id->UserLength, idW.User, idW.UserLength ); + } + if (id->DomainLength) + { + idW.DomainLength = MultiByteToWideChar( CP_ACP, 0, (char *)id->Domain, id->DomainLength, NULL, 0 ); + if (!(idW.Domain = malloc( idW.DomainLength * sizeof(SEC_WCHAR) ))) goto done; + MultiByteToWideChar( CP_ACP, 0, (char *)id->Domain, id->DomainLength, idW.Domain, idW.DomainLength ); + } + if (id->PasswordLength) + { + idW.PasswordLength = MultiByteToWideChar( CP_ACP, 0, (char *)id->Password, id->PasswordLength, NULL, 0 ); + if (!(idW.Password = malloc( idW.PasswordLength * sizeof(SEC_WCHAR) ))) goto done; + MultiByteToWideChar( CP_ACP, 0, (char *)id->Password, id->PasswordLength, idW.Password, idW.PasswordLength ); } - else auth_dataW = (PSEC_WINNT_AUTH_IDENTITY_W)auth_data; + idW.Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE; + auth_data = &idW; }
- status = lsa_AcquireCredentialsHandleW( principalW, packageW, credentials_use, logon_id, auth_dataW, get_key_fn, + status = lsa_AcquireCredentialsHandleW( principalW, packageW, credentials_use, logon_id, auth_data, get_key_fn, get_key_arg, credential, ts_expiry ); done: - if (auth_dataW != (SEC_WINNT_AUTH_IDENTITY_W *)id) free( auth_dataW ); free( packageW ); free( principalW ); - free( user ); - free( domain ); - free( passwd ); + free( idW.User ); + free( idW.Domain ); + free( idW.Password ); return status; }