From ab91c011121b76bcc46fc7e3b3addefd1b3acca2 Mon Sep 17 00:00:00 2001 From: Sebastian Lackner Date: Mon, 16 Mar 2015 03:38:58 +0100 Subject: [PATCH] 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 bcf95ec2191..2eb1c2ab95c 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 887c6b08a17..7512aedae60 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 6ea7b541739..4552e4039f8 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");