Sebastian Lackner : ntdll: RtlFindActivationContextSectionString should accept a NULL pointer as data.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Mar 17 11:01:59 CDT 2015


Module: wine
Branch: master
Commit: ab91c011121b76bcc46fc7e3b3addefd1b3acca2
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=ab91c011121b76bcc46fc7e3b3addefd1b3acca2

Author: Sebastian Lackner <sebastian at fds-team.de>
Date:   Mon Mar 16 03:38:58 2015 +0100

ntdll: RtlFindActivationContextSectionString should accept a NULL pointer as data.

---

 dlls/kernel32/actctx.c       |  8 ++++-
 dlls/kernel32/tests/actctx.c | 10 ++++--
 dlls/ntdll/actctx.c          | 81 ++++++++++++++++++++++++--------------------
 3 files changed, 59 insertions(+), 40 deletions(-)

diff --git a/dlls/kernel32/actctx.c b/dlls/kernel32/actctx.c
index bcf95ec..2eb1c2a 100644
--- a/dlls/kernel32/actctx.c
+++ b/dlls/kernel32/actctx.c
@@ -227,7 +227,7 @@ BOOL WINAPI FindActCtxSectionStringA(DWORD dwFlags, const GUID* lpExtGuid,
     TRACE("%08x %s %u %s %p\n", dwFlags, debugstr_guid(lpExtGuid),
           ulId, debugstr_a(lpSearchStr), pInfo);
 
-    if (!lpSearchStr)
+    if (!lpSearchStr || !pInfo)
     {
         SetLastError(ERROR_INVALID_PARAMETER);
         return FALSE;
@@ -255,6 +255,12 @@ BOOL WINAPI FindActCtxSectionStringW(DWORD dwFlags, const GUID* lpExtGuid,
     UNICODE_STRING us;
     NTSTATUS status;
 
+    if (!pInfo)
+    {
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return FALSE;
+    }
+
     RtlInitUnicodeString(&us, lpSearchStr);
     if ((status = RtlFindActivationContextSectionString(dwFlags, lpExtGuid, ulId, &us, pInfo)))
     {
diff --git a/dlls/kernel32/tests/actctx.c b/dlls/kernel32/tests/actctx.c
index 887c6b0..7512aed 100644
--- a/dlls/kernel32/tests/actctx.c
+++ b/dlls/kernel32/tests/actctx.c
@@ -2148,9 +2148,13 @@ static void ntdll_find(ULONG section, const char *string_to_find, BOOL should_fi
             "RtlFindActivationContextSectionString: unexpected status 0x%x\n", ret);
 
     ret = pRtlFindActivationContextSectionString(0, NULL, section, &string_to_findW, NULL);
-    todo_wine
-    ok_(__FILE__, line)(ret == (should_find ? STATUS_SUCCESS : STATUS_SXS_KEY_NOT_FOUND),
-        "RtlFindActivationContextSectionString: unexpected status 0x%x\n", ret);
+    if (todo)
+        todo_wine
+        ok_(__FILE__, line)(ret == (should_find ? STATUS_SUCCESS : STATUS_SXS_KEY_NOT_FOUND),
+            "RtlFindActivationContextSectionString: unexpected status 0x%x\n", ret);
+    else
+        ok_(__FILE__, line)(ret == (should_find ? STATUS_SUCCESS : STATUS_SXS_KEY_NOT_FOUND),
+            "RtlFindActivationContextSectionString: unexpected status 0x%x\n", ret);
 
     pRtlFreeUnicodeString(&string_to_findW);
 }
diff --git a/dlls/ntdll/actctx.c b/dlls/ntdll/actctx.c
index 6ea7b54..4552e40 100644
--- a/dlls/ntdll/actctx.c
+++ b/dlls/ntdll/actctx.c
@@ -3133,19 +3133,22 @@ static NTSTATUS find_dll_redirection(ACTIVATION_CONTEXT* actctx, const UNICODE_S
     index = find_string_index(actctx->dllredirect_section, name);
     if (!index) return STATUS_SXS_KEY_NOT_FOUND;
 
-    dll = get_dllredirect_data(actctx, index);
+    if (data)
+    {
+        dll = get_dllredirect_data(actctx, index);
 
-    data->ulDataFormatVersion = 1;
-    data->lpData = dll;
-    data->ulLength = dll->size;
-    data->lpSectionGlobalData = NULL;
-    data->ulSectionGlobalDataLength = 0;
-    data->lpSectionBase = actctx->dllredirect_section;
-    data->ulSectionTotalLength = RtlSizeHeap( GetProcessHeap(), 0, actctx->dllredirect_section );
-    data->hActCtx = NULL;
+        data->ulDataFormatVersion = 1;
+        data->lpData = dll;
+        data->ulLength = dll->size;
+        data->lpSectionGlobalData = NULL;
+        data->ulSectionGlobalDataLength = 0;
+        data->lpSectionBase = actctx->dllredirect_section;
+        data->ulSectionTotalLength = RtlSizeHeap( GetProcessHeap(), 0, actctx->dllredirect_section );
+        data->hActCtx = NULL;
 
-    if (data->cbSize >= FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA, ulAssemblyRosterIndex) + sizeof(ULONG))
-        data->ulAssemblyRosterIndex = index->rosterindex;
+        if (data->cbSize >= FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA, ulAssemblyRosterIndex) + sizeof(ULONG))
+            data->ulAssemblyRosterIndex = index->rosterindex;
+    }
 
     return STATUS_SUCCESS;
 }
@@ -3342,20 +3345,23 @@ static NTSTATUS find_window_class(ACTIVATION_CONTEXT* actctx, const UNICODE_STRI
 
     if (!index) return STATUS_SXS_KEY_NOT_FOUND;
 
-    class = get_wndclass_data(actctx, index);
+    if (data)
+    {
+        class = get_wndclass_data(actctx, index);
 
-    data->ulDataFormatVersion = 1;
-    data->lpData = class;
-    /* full length includes string length with nulls */
-    data->ulLength = class->size + class->name_len + class->module_len + 2*sizeof(WCHAR);
-    data->lpSectionGlobalData = NULL;
-    data->ulSectionGlobalDataLength = 0;
-    data->lpSectionBase = actctx->wndclass_section;
-    data->ulSectionTotalLength = RtlSizeHeap( GetProcessHeap(), 0, actctx->wndclass_section );
-    data->hActCtx = NULL;
+        data->ulDataFormatVersion = 1;
+        data->lpData = class;
+        /* full length includes string length with nulls */
+        data->ulLength = class->size + class->name_len + class->module_len + 2*sizeof(WCHAR);
+        data->lpSectionGlobalData = NULL;
+        data->ulSectionGlobalDataLength = 0;
+        data->lpSectionBase = actctx->wndclass_section;
+        data->ulSectionTotalLength = RtlSizeHeap( GetProcessHeap(), 0, actctx->wndclass_section );
+        data->hActCtx = NULL;
 
-    if (data->cbSize >= FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA, ulAssemblyRosterIndex) + sizeof(ULONG))
-        data->ulAssemblyRosterIndex = index->rosterindex;
+        if (data->cbSize >= FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA, ulAssemblyRosterIndex) + sizeof(ULONG))
+            data->ulAssemblyRosterIndex = index->rosterindex;
+    }
 
     return STATUS_SUCCESS;
 }
@@ -4397,19 +4403,22 @@ static NTSTATUS find_progid_redirection(ACTIVATION_CONTEXT* actctx, const UNICOD
     index = find_string_index(actctx->progid_section, name);
     if (!index) return STATUS_SXS_KEY_NOT_FOUND;
 
-    progid = get_progid_data(actctx, index);
+    if (data)
+    {
+        progid = get_progid_data(actctx, index);
 
-    data->ulDataFormatVersion = 1;
-    data->lpData = progid;
-    data->ulLength = progid->size;
-    data->lpSectionGlobalData = (BYTE*)actctx->progid_section + actctx->progid_section->global_offset;
-    data->ulSectionGlobalDataLength = actctx->progid_section->global_len;
-    data->lpSectionBase = actctx->progid_section;
-    data->ulSectionTotalLength = RtlSizeHeap( GetProcessHeap(), 0, actctx->progid_section );
-    data->hActCtx = NULL;
+        data->ulDataFormatVersion = 1;
+        data->lpData = progid;
+        data->ulLength = progid->size;
+        data->lpSectionGlobalData = (BYTE*)actctx->progid_section + actctx->progid_section->global_offset;
+        data->ulSectionGlobalDataLength = actctx->progid_section->global_len;
+        data->lpSectionBase = actctx->progid_section;
+        data->ulSectionTotalLength = RtlSizeHeap( GetProcessHeap(), 0, actctx->progid_section );
+        data->hActCtx = NULL;
 
-    if (data->cbSize >= FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA, ulAssemblyRosterIndex) + sizeof(ULONG))
-        data->ulAssemblyRosterIndex = index->rosterindex;
+        if (data->cbSize >= FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA, ulAssemblyRosterIndex) + sizeof(ULONG))
+            data->ulAssemblyRosterIndex = index->rosterindex;
+    }
 
     return STATUS_SUCCESS;
 }
@@ -4441,7 +4450,7 @@ static NTSTATUS find_string(ACTIVATION_CONTEXT* actctx, ULONG section_kind,
 
     if (status != STATUS_SUCCESS) return status;
 
-    if (flags & FIND_ACTCTX_SECTION_KEY_RETURN_HACTCTX)
+    if (data && (flags & FIND_ACTCTX_SECTION_KEY_RETURN_HACTCTX))
     {
         actctx_addref(actctx);
         data->hActCtx = actctx;
@@ -5008,7 +5017,7 @@ NTSTATUS WINAPI RtlFindActivationContextSectionString( ULONG flags, const GUID *
         FIXME("unknown flags %08x\n", flags);
         return STATUS_INVALID_PARAMETER;
     }
-    if (!data || data->cbSize < offsetof(ACTCTX_SECTION_KEYED_DATA, ulAssemblyRosterIndex) ||
+    if ((data && data->cbSize < offsetof(ACTCTX_SECTION_KEYED_DATA, ulAssemblyRosterIndex)) ||
         !section_name || !section_name->Buffer)
     {
         WARN("invalid parameter\n");




More information about the wine-cvs mailing list