Commit b98c2e38 authored by Alexandre Julliard's avatar Alexandre Julliard

Append .dll extension in all cases (spotted by Mike Hearn).

parent 5c38e1b5
...@@ -1354,45 +1354,42 @@ static NTSTATUS find_dll_file( const WCHAR *load_path, const WCHAR *libname, ...@@ -1354,45 +1354,42 @@ static NTSTATUS find_dll_file( const WCHAR *load_path, const WCHAR *libname,
OBJECT_ATTRIBUTES attr; OBJECT_ATTRIBUTES attr;
IO_STATUS_BLOCK io; IO_STATUS_BLOCK io;
UNICODE_STRING nt_name; UNICODE_STRING nt_name;
WCHAR *file_part, *ext; WCHAR *file_part, *ext, *dllname;
ULONG len; ULONG len;
nt_name.Buffer = NULL; /* first append .dll if needed */
if (RtlDetermineDosPathNameType_U( libname ) == RELATIVE_PATH)
{ dllname = NULL;
/* we need to search for it */
/* but first append .dll because RtlDosSearchPath extension handling is broken */
if (!(ext = strrchrW( libname, '.')) || strchrW( ext, '/' ) || strchrW( ext, '\\')) if (!(ext = strrchrW( libname, '.')) || strchrW( ext, '/' ) || strchrW( ext, '\\'))
{ {
WCHAR *dllname;
if (!(dllname = RtlAllocateHeap( GetProcessHeap(), 0, if (!(dllname = RtlAllocateHeap( GetProcessHeap(), 0,
(strlenW(libname) * sizeof(WCHAR)) + sizeof(dllW) ))) (strlenW(libname) * sizeof(WCHAR)) + sizeof(dllW) )))
return STATUS_NO_MEMORY; return STATUS_NO_MEMORY;
strcpyW( dllname, libname ); strcpyW( dllname, libname );
strcatW( dllname, dllW ); strcatW( dllname, dllW );
len = RtlDosSearchPath_U( load_path, dllname, NULL, *size, filename, &file_part ); libname = dllname;
RtlFreeHeap( GetProcessHeap(), 0, dllname );
} }
else len = RtlDosSearchPath_U( load_path, libname, NULL, *size, filename, &file_part );
if (len) nt_name.Buffer = NULL;
if (RtlDetermineDosPathNameType_U( libname ) == RELATIVE_PATH)
{ {
if (len >= *size) /* we need to search for it */
len = RtlDosSearchPath_U( load_path, libname, NULL, *size, filename, &file_part );
if (len)
{ {
*size = len + sizeof(WCHAR); if (len >= *size) goto overflow;
return STATUS_BUFFER_TOO_SMALL; if ((*pwm = find_fullname_module( filename )) != NULL) goto found;
}
if ((*pwm = find_fullname_module( filename )) != NULL) return STATUS_SUCCESS;
/* check for already loaded module in a different path */ /* check for already loaded module in a different path */
if (!contains_path( libname )) if (!contains_path( libname ))
{ {
if ((*pwm = find_basename_module( file_part )) != NULL) return STATUS_SUCCESS; if ((*pwm = find_basename_module( file_part )) != NULL) goto found;
} }
if (!RtlDosPathNameToNtPathName_U( filename, &nt_name, NULL, NULL )) if (!RtlDosPathNameToNtPathName_U( filename, &nt_name, NULL, NULL ))
{
RtlFreeHeap( GetProcessHeap(), 0, dllname );
return STATUS_NO_MEMORY; return STATUS_NO_MEMORY;
}
attr.Length = sizeof(attr); attr.Length = sizeof(attr);
attr.RootDirectory = 0; attr.RootDirectory = 0;
attr.Attributes = OBJ_CASE_INSENSITIVE; attr.Attributes = OBJ_CASE_INSENSITIVE;
...@@ -1400,8 +1397,7 @@ static NTSTATUS find_dll_file( const WCHAR *load_path, const WCHAR *libname, ...@@ -1400,8 +1397,7 @@ static NTSTATUS find_dll_file( const WCHAR *load_path, const WCHAR *libname,
attr.SecurityDescriptor = NULL; attr.SecurityDescriptor = NULL;
attr.SecurityQualityOfService = NULL; attr.SecurityQualityOfService = NULL;
if (NtOpenFile( handle, GENERIC_READ, &attr, &io, FILE_SHARE_READ|FILE_SHARE_DELETE, 0 )) *handle = 0; if (NtOpenFile( handle, GENERIC_READ, &attr, &io, FILE_SHARE_READ|FILE_SHARE_DELETE, 0 )) *handle = 0;
RtlFreeUnicodeString( &nt_name ); goto found;
return STATUS_SUCCESS;
} }
/* not found */ /* not found */
...@@ -1413,31 +1409,21 @@ static NTSTATUS find_dll_file( const WCHAR *load_path, const WCHAR *libname, ...@@ -1413,31 +1409,21 @@ static NTSTATUS find_dll_file( const WCHAR *load_path, const WCHAR *libname,
len = strlenW(libname) * sizeof(WCHAR); len = strlenW(libname) * sizeof(WCHAR);
if (len >= *size) goto overflow; if (len >= *size) goto overflow;
strcpyW( filename, libname ); strcpyW( filename, libname );
if (!strchrW( filename, '.' ))
{
len += sizeof(dllW) - sizeof(WCHAR);
if (len >= *size) goto overflow;
strcatW( filename, dllW );
}
*pwm = find_basename_module( filename ); *pwm = find_basename_module( filename );
return STATUS_SUCCESS; goto found;
} }
} }
/* absolute path name, or relative path name but not found above */ /* absolute path name, or relative path name but not found above */
if (!RtlDosPathNameToNtPathName_U( libname, &nt_name, &file_part, NULL )) if (!RtlDosPathNameToNtPathName_U( libname, &nt_name, &file_part, NULL ))
{
RtlFreeHeap( GetProcessHeap(), 0, dllname );
return STATUS_NO_MEMORY; return STATUS_NO_MEMORY;
}
len = nt_name.Length - 4*sizeof(WCHAR); /* for \??\ prefix */ len = nt_name.Length - 4*sizeof(WCHAR); /* for \??\ prefix */
if (len >= *size) goto overflow; if (len >= *size) goto overflow;
memcpy( filename, nt_name.Buffer + 4, len + sizeof(WCHAR) ); memcpy( filename, nt_name.Buffer + 4, len + sizeof(WCHAR) );
if (file_part && !strchrW( file_part, '.' ))
{
len += sizeof(dllW) - sizeof(WCHAR);
if (len >= *size) goto overflow;
strcatW( filename, dllW );
}
if (!(*pwm = find_fullname_module( filename ))) if (!(*pwm = find_fullname_module( filename )))
{ {
attr.Length = sizeof(attr); attr.Length = sizeof(attr);
...@@ -1448,11 +1434,14 @@ static NTSTATUS find_dll_file( const WCHAR *load_path, const WCHAR *libname, ...@@ -1448,11 +1434,14 @@ static NTSTATUS find_dll_file( const WCHAR *load_path, const WCHAR *libname,
attr.SecurityQualityOfService = NULL; attr.SecurityQualityOfService = NULL;
if (NtOpenFile( handle, GENERIC_READ, &attr, &io, FILE_SHARE_READ|FILE_SHARE_DELETE, 0 )) *handle = 0; if (NtOpenFile( handle, GENERIC_READ, &attr, &io, FILE_SHARE_READ|FILE_SHARE_DELETE, 0 )) *handle = 0;
} }
found:
RtlFreeUnicodeString( &nt_name ); RtlFreeUnicodeString( &nt_name );
RtlFreeHeap( GetProcessHeap(), 0, dllname );
return STATUS_SUCCESS; return STATUS_SUCCESS;
overflow: overflow:
RtlFreeUnicodeString( &nt_name ); RtlFreeUnicodeString( &nt_name );
RtlFreeHeap( GetProcessHeap(), 0, dllname );
*size = len + sizeof(WCHAR); *size = len + sizeof(WCHAR);
return STATUS_BUFFER_TOO_SMALL; return STATUS_BUFFER_TOO_SMALL;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment