Alexandre Julliard : kernel32: Implement safe dll search mode.
Alexandre Julliard
julliard at winehq.org
Mon Aug 28 14:05:17 CDT 2017
Module: wine
Branch: master
Commit: 66e302f80b2ecaac087756f1df3ae55f77f33838
URL: http://source.winehq.org/git/wine.git/?a=commit;h=66e302f80b2ecaac087756f1df3ae55f77f33838
Author: Alexandre Julliard <julliard at winehq.org>
Date: Mon Aug 28 12:47:34 2017 +0200
kernel32: Implement safe dll search mode.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/kernel32/module.c | 69 +++++++++++++++++++++++++++++++++++++++++++++-----
1 file changed, 63 insertions(+), 6 deletions(-)
diff --git a/dlls/kernel32/module.c b/dlls/kernel32/module.c
index badfe1d..97d815c 100644
--- a/dlls/kernel32/module.c
+++ b/dlls/kernel32/module.c
@@ -728,13 +728,11 @@ static const WCHAR *get_dll_system_path(void)
if (!cached_path)
{
WCHAR *p, *path;
- int len = 3;
+ int len = 1;
len += 2 * GetSystemDirectoryW( NULL, 0 );
len += GetWindowsDirectoryW( NULL, 0 );
p = path = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) );
- *p++ = '.';
- *p++ = ';';
GetSystemDirectoryW( p, path + len - p);
p += strlenW(p);
/* if system directory ends in "32" add 16-bit version too */
@@ -751,6 +749,52 @@ static const WCHAR *get_dll_system_path(void)
return cached_path;
}
+/***********************************************************************
+ * get_dll_safe_mode
+ */
+static BOOL get_dll_safe_mode(void)
+{
+ static const WCHAR keyW[] = {'\\','R','e','g','i','s','t','r','y','\\',
+ 'M','a','c','h','i','n','e','\\',
+ 'S','y','s','t','e','m','\\',
+ 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
+ 'C','o','n','t','r','o','l','\\',
+ 'S','e','s','s','i','o','n',' ','M','a','n','a','g','e','r',0};
+ static const WCHAR valueW[] = {'S','a','f','e','D','l','l','S','e','a','r','c','h','M','o','d','e',0};
+
+ static int safe_mode = -1;
+
+ if (safe_mode == -1)
+ {
+ char buffer[offsetof(KEY_VALUE_PARTIAL_INFORMATION, Data[sizeof(DWORD)])];
+ KEY_VALUE_PARTIAL_INFORMATION *info = (KEY_VALUE_PARTIAL_INFORMATION *)buffer;
+ OBJECT_ATTRIBUTES attr;
+ UNICODE_STRING nameW;
+ HANDLE hkey;
+ DWORD size = sizeof(buffer);
+
+ attr.Length = sizeof(attr);
+ attr.RootDirectory = 0;
+ attr.ObjectName = &nameW;
+ attr.Attributes = 0;
+ attr.SecurityDescriptor = NULL;
+ attr.SecurityQualityOfService = NULL;
+
+ safe_mode = 1;
+ RtlInitUnicodeString( &nameW, keyW );
+ if (!NtOpenKey( &hkey, KEY_READ, &attr ))
+ {
+ RtlInitUnicodeString( &nameW, valueW );
+ if (!NtQueryValueKey( hkey, &nameW, KeyValuePartialInformation, buffer, size, &size ) &&
+ info->Type == REG_DWORD && info->DataLength == sizeof(DWORD))
+ safe_mode = !!*(DWORD *)info->Data;
+ NtClose( hkey );
+ }
+ if (!safe_mode) TRACE( "SafeDllSearchMode disabled through the registry\n" );
+ }
+ return safe_mode;
+}
+
/******************************************************************
* get_module_path_end
*
@@ -783,6 +827,7 @@ WCHAR *MODULE_get_dll_load_path( LPCWSTR module )
const WCHAR *system_path = get_dll_system_path();
const WCHAR *mod_end = NULL;
UNICODE_STRING name, value;
+ BOOL safe_mode;
WCHAR *p, *ret;
int len = 0, path_len = 0;
@@ -811,7 +856,9 @@ WCHAR *MODULE_get_dll_load_path( LPCWSTR module )
path_len = value.Length;
RtlEnterCriticalSection( &dlldir_section );
+ safe_mode = get_dll_safe_mode();
if (dll_directory) len += strlenW(dll_directory) + 1;
+ else len += 2; /* current directory */
if ((p = ret = HeapAlloc( GetProcessHeap(), 0, path_len + len * sizeof(WCHAR) )))
{
if (module)
@@ -826,13 +873,23 @@ WCHAR *MODULE_get_dll_load_path( LPCWSTR module )
p += strlenW(p);
*p++ = ';';
}
+ else if (!safe_mode)
+ {
+ *p++ = '.';
+ *p++ = ';';
+ }
+ strcpyW( p, system_path );
+ p += strlenW(p);
+ *p++ = ';';
+ if (!dll_directory && safe_mode)
+ {
+ *p++ = '.';
+ *p++ = ';';
+ }
}
RtlLeaveCriticalSection( &dlldir_section );
if (!ret) return NULL;
- strcpyW( p, system_path );
- p += strlenW(p);
- *p++ = ';';
value.Buffer = p;
value.MaximumLength = path_len;
More information about the wine-cvs
mailing list