nla: Fix unicode issues with gateway code

Gateway code was passing a char string as the package name to
`credssp_auth_init`. When using Unicode builds this fails since
`QuerySecurityPackageInfo` expects a wchar string.

Additionally with unicode builds, `credssp_auth_pkg_name` causes string
type mismatches in the gateway code where a char string is expected.
This commit is contained in:
Martin Fleisz 2022-11-03 13:47:21 +01:00 committed by David Fort
parent b04c0e7b1c
commit fbbcd9b8ef
5 changed files with 18 additions and 6 deletions

View File

@ -66,6 +66,9 @@ struct rdp_credssp_auth
ULONG flags; ULONG flags;
SecPkgContext_Sizes sizes; SecPkgContext_Sizes sizes;
enum AUTH_STATE state; enum AUTH_STATE state;
#ifdef UNICODE
char* pkgNameA;
#endif
}; };
static BOOL parseKerberosDeltat(const char* value, INT32* dest, const char* message); static BOOL parseKerberosDeltat(const char* value, INT32* dest, const char* message);
@ -588,10 +591,16 @@ size_t credssp_auth_trailer_size(rdpCredsspAuth* auth)
return auth->sizes.cbSecurityTrailer; return auth->sizes.cbSecurityTrailer;
} }
const TCHAR* credssp_auth_pkg_name(rdpCredsspAuth* auth) const char* credssp_auth_pkg_name(rdpCredsspAuth* auth)
{ {
WINPR_ASSERT(auth && auth->info); WINPR_ASSERT(auth && auth->info);
#ifdef UNICODE
if (!auth->pkgNameA)
ConvertFromUnicode(CP_UTF8, 0, auth->info->Name, -1, &auth->pkgNameA, 0, NULL, NULL);
return auth->pkgNameA;
#else
return auth->info->Name; return auth->info->Name;
#endif
} }
void credssp_auth_free(rdpCredsspAuth* auth) void credssp_auth_free(rdpCredsspAuth* auth)
@ -639,6 +648,9 @@ void credssp_auth_free(rdpCredsspAuth* auth)
free(auth->spn); free(auth->spn);
sspi_SecBufferFree(&auth->input_buffer); sspi_SecBufferFree(&auth->input_buffer);
sspi_SecBufferFree(&auth->output_buffer); sspi_SecBufferFree(&auth->output_buffer);
#ifdef UNICODE
free(auth->pkgNameA);
#endif
free(auth); free(auth);
} }

View File

@ -54,7 +54,7 @@ FREERDP_LOCAL void credssp_auth_take_input_buffer(rdpCredsspAuth* auth, SecBuffe
FREERDP_LOCAL const SecBuffer* credssp_auth_get_output_buffer(rdpCredsspAuth* auth); FREERDP_LOCAL const SecBuffer* credssp_auth_get_output_buffer(rdpCredsspAuth* auth);
FREERDP_LOCAL BOOL credssp_auth_have_output_token(rdpCredsspAuth* auth); FREERDP_LOCAL BOOL credssp_auth_have_output_token(rdpCredsspAuth* auth);
FREERDP_LOCAL BOOL credssp_auth_is_complete(rdpCredsspAuth* auth); FREERDP_LOCAL BOOL credssp_auth_is_complete(rdpCredsspAuth* auth);
FREERDP_LOCAL const TCHAR* credssp_auth_pkg_name(rdpCredsspAuth* auth); FREERDP_LOCAL const char* credssp_auth_pkg_name(rdpCredsspAuth* auth);
FREERDP_LOCAL size_t credssp_auth_trailer_size(rdpCredsspAuth* auth); FREERDP_LOCAL size_t credssp_auth_trailer_size(rdpCredsspAuth* auth);
FREERDP_LOCAL void credssp_auth_free(rdpCredsspAuth* auth); FREERDP_LOCAL void credssp_auth_free(rdpCredsspAuth* auth);

View File

@ -30,7 +30,7 @@
#define TAG FREERDP_TAG("core.gateway.ntlm") #define TAG FREERDP_TAG("core.gateway.ntlm")
#define AUTH_PKG CREDSSP_AUTH_PKG_NTLM #define AUTH_PKG NTLM_SSP_NAME
static wStream* rpc_auth_http_request(HttpContext* http, const char* method, int contentLength, static wStream* rpc_auth_http_request(HttpContext* http, const char* method, int contentLength,
const SecBuffer* authToken, const char* auth_scheme) const SecBuffer* authToken, const char* auth_scheme)

View File

@ -44,9 +44,9 @@
#define TAG FREERDP_TAG("core.gateway.rdg") #define TAG FREERDP_TAG("core.gateway.rdg")
#if defined(_WIN32) || defined(WITH_SPNEGO) #if defined(_WIN32) || defined(WITH_SPNEGO)
#define AUTH_PKG CREDSSP_AUTH_PKG_SPNEGO #define AUTH_PKG NEGO_SSP_NAME
#else #else
#define AUTH_PKG CREDSSP_AUTH_PKG_NTLM #define AUTH_PKG NTLM_SSP_NAME
#endif #endif
/* HTTP channel response fields present flags. */ /* HTTP channel response fields present flags. */

View File

@ -33,7 +33,7 @@
#define TAG FREERDP_TAG("core.gateway.rpc") #define TAG FREERDP_TAG("core.gateway.rpc")
#define AUTH_PKG CREDSSP_AUTH_PKG_NTLM #define AUTH_PKG NTLM_SSP_NAME
/** /**
* Connection-Oriented RPC Protocol Client Details: * Connection-Oriented RPC Protocol Client Details: