ntdll: Use RtlCompareUnicodeStrings() instead of strncmpiW().

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Alexandre Julliard 2020-03-27 13:39:44 +01:00
parent 4d93bafe96
commit 2f7cc584ce
3 changed files with 20 additions and 12 deletions

View file

@ -2102,7 +2102,7 @@ static NTSTATUS find_file_in_dir( char *unix_name, int pos, const WCHAR *name, i
{
ret = ntdll_umbstowcs( kde[1].d_name, strlen(kde[1].d_name),
buffer, MAX_DIR_ENTRY_LEN );
if (ret == length && !strncmpiW( buffer, name, length))
if (ret == length && !RtlCompareUnicodeStrings( buffer, ret, name, ret, TRUE ))
{
strcpy( unix_name + pos, kde[1].d_name );
RtlLeaveCriticalSection( &dir_section );
@ -2112,7 +2112,7 @@ static NTSTATUS find_file_in_dir( char *unix_name, int pos, const WCHAR *name, i
}
ret = ntdll_umbstowcs( kde[0].d_name, strlen(kde[0].d_name),
buffer, MAX_DIR_ENTRY_LEN );
if (ret == length && !strncmpiW( buffer, name, length))
if (ret == length && !RtlCompareUnicodeStrings( buffer, ret, name, ret, TRUE ))
{
strcpy( unix_name + pos,
kde[1].d_name[0] ? kde[1].d_name : kde[0].d_name );
@ -2146,7 +2146,7 @@ static NTSTATUS find_file_in_dir( char *unix_name, int pos, const WCHAR *name, i
while ((de = readdir( dir )))
{
ret = ntdll_umbstowcs( de->d_name, strlen(de->d_name), buffer, MAX_DIR_ENTRY_LEN );
if (ret == length && !strncmpiW( buffer, name, length ))
if (ret == length && !RtlCompareUnicodeStrings( buffer, ret, name, ret, TRUE ))
{
strcpy( unix_name + pos, de->d_name );
closedir( dir );

View file

@ -903,16 +903,20 @@ NTSTATUS WINAPI RtlDestroyEnvironment(PWSTR env)
static LPCWSTR ENV_FindVariable(PCWSTR var, PCWSTR name, unsigned namelen)
{
for (; *var; var += strlenW(var) + 1)
while (*var)
{
/* match var names, but avoid setting a var with a name including a '='
* (a starting '=' is valid though)
*/
if (strncmpiW(var, name, namelen) == 0 && var[namelen] == '=' &&
strchrW(var + 1, '=') == var + namelen)
unsigned int len = strlenW( var );
if (len > namelen &&
var[namelen] == '=' &&
!RtlCompareUnicodeStrings( var, namelen, name, namelen, TRUE ) &&
strchrW(var + 1, '=') == var + namelen)
{
return var + namelen + 1;
}
var += len + 1;
}
return NULL;
}
@ -987,7 +991,7 @@ void WINAPI RtlSetCurrentEnvironment(PWSTR new_env, PWSTR* old_env)
NTSTATUS WINAPI RtlSetEnvironmentVariable(PWSTR* penv, PUNICODE_STRING name,
PUNICODE_STRING value)
{
INT len, old_size;
INT varlen, len, old_size;
LPWSTR p, env;
NTSTATUS nts = STATUS_VARIABLE_NOT_FOUND;
@ -1011,9 +1015,11 @@ NTSTATUS WINAPI RtlSetEnvironmentVariable(PWSTR* penv, PUNICODE_STRING name,
old_size = get_env_length( env );
/* Find a place to insert the string */
for (p = env; *p; p += strlenW(p) + 1)
for (p = env; *p; p += varlen + 1)
{
if (!strncmpiW(name->Buffer, p, len) && (p[len] == '=')) break;
varlen = strlenW(p);
if (varlen > len && p[len] == '=' &&
!RtlCompareUnicodeStrings( name->Buffer, len, p, len, TRUE )) break;
}
if (!value && !*p) goto done; /* Value to remove doesn't exist */

View file

@ -2768,10 +2768,12 @@ static NTSTATUS find_actctx_dll( LPCWSTR libname, LPWSTR *fullname )
if ((p = strrchrW( info->lpAssemblyManifestPath, '\\' )))
{
DWORD dirlen = info->ulAssemblyDirectoryNameLength / sizeof(WCHAR);
DWORD len, dirlen = info->ulAssemblyDirectoryNameLength / sizeof(WCHAR);
p++;
if (!dirlen || strncmpiW( p, info->lpAssemblyDirectoryName, dirlen ) || wcsicmp( p + dirlen, dotManifestW ))
len = strlenW( p );
if (!dirlen || len <= dirlen ||
RtlCompareUnicodeStrings( p, dirlen, info->lpAssemblyDirectoryName, dirlen, TRUE ) ||
wcsicmp( p + dirlen, dotManifestW ))
{
/* manifest name does not match directory name, so it's not a global
* windows/winsxs manifest; use the manifest directory name instead */