Module: wine Branch: master Commit: ab91c011121b76bcc46fc7e3b3addefd1b3acca2 URL: http://source.winehq.org/git/wine.git/?a=commit;h=ab91c011121b76bcc46fc7e3b3...
Author: Sebastian Lackner sebastian@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");