From 38f9a788c44907a798592df6b5d60edc145f7f78 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Fri, 29 Jan 2016 15:04:47 +0900 Subject: [PATCH] ntdll: Add tests for NULL object attributes. Signed-off-by: Alexandre Julliard --- dlls/ntdll/file.c | 3 +- dlls/ntdll/om.c | 2 +- dlls/ntdll/tests/file.c | 14 --------- dlls/ntdll/tests/om.c | 64 +++++++++++++++++++++++++++++++++++++++-- 4 files changed, 65 insertions(+), 18 deletions(-) diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c index 43b74b2ebf..3883e5aa5d 100644 --- a/dlls/ntdll/file.c +++ b/dlls/ntdll/file.c @@ -3513,6 +3513,8 @@ NTSTATUS WINAPI NtCreateNamedPipeFile( PHANDLE handle, ULONG access, options, pipe_type, read_mode, completion_mode, max_inst, inbound_quota, outbound_quota, timeout); + if (!attr) return STATUS_INVALID_PARAMETER; + /* assume we only get relative timeout */ if (timeout->QuadPart > 0) FIXME("Wrong time %s\n", wine_dbgstr_longlong(timeout->QuadPart)); @@ -3637,7 +3639,6 @@ NTSTATUS WINAPI NtCreateMailslotFile(PHANDLE pHandle, ULONG DesiredAccess, if (!pHandle) return STATUS_ACCESS_VIOLATION; if (!attr) return STATUS_INVALID_PARAMETER; - if (!attr->ObjectName) return STATUS_OBJECT_PATH_SYNTAX_BAD; if ((ret = alloc_object_attributes( attr, &objattr, &len ))) return ret; diff --git a/dlls/ntdll/om.c b/dlls/ntdll/om.c index 7aa2fea06b..1279f2bb4c 100644 --- a/dlls/ntdll/om.c +++ b/dlls/ntdll/om.c @@ -623,7 +623,7 @@ NTSTATUS WINAPI NtCreateSymbolicLinkObject(OUT PHANDLE SymbolicLinkHandle,IN ACC data_size_t len; struct object_attributes *objattr; - if (!SymbolicLinkHandle || !TargetName) return STATUS_ACCESS_VIOLATION; + if (!SymbolicLinkHandle || !attr || !TargetName) return STATUS_ACCESS_VIOLATION; if (!TargetName->Buffer) return STATUS_INVALID_PARAMETER; TRACE("(%p,0x%08x,%s -> %s)\n", SymbolicLinkHandle, DesiredAccess, diff --git a/dlls/ntdll/tests/file.c b/dlls/ntdll/tests/file.c index 7bf2ffe852..71e1d7a326 100644 --- a/dlls/ntdll/tests/file.c +++ b/dlls/ntdll/tests/file.c @@ -1157,20 +1157,6 @@ static void nt_mailslot_test(void) if (rc == STATUS_SUCCESS) pNtClose(hslot); - /* - * Test handling of a NULL unicode string in ObjectName - */ - InitializeObjectAttributes(&attr, &str, OBJ_CASE_INSENSITIVE, 0, NULL); - attr.ObjectName = NULL; - rc = pNtCreateMailslotFile(&hslot, DesiredAccess, - &attr, &IoStatusBlock, CreateOptions, MailslotQuota, MaxMessageSize, - &TimeOut); - ok( rc == STATUS_OBJECT_PATH_SYNTAX_BAD || - rc == STATUS_INVALID_PARAMETER, - "rc = %x not STATUS_OBJECT_PATH_SYNTAX_BAD or STATUS_INVALID_PARAMETER\n", rc); - - if (rc == STATUS_SUCCESS) pNtClose(hslot); - /* * Test a valid call */ diff --git a/dlls/ntdll/tests/om.c b/dlls/ntdll/tests/om.c index e2593b104d..d7248e8425 100644 --- a/dlls/ntdll/tests/om.c +++ b/dlls/ntdll/tests/om.c @@ -666,7 +666,7 @@ static void test_name_limits(void) todo_wine ok( status == STATUS_OBJECT_NAME_INVALID, "%u: NtOpenSection failed %x\n", str.Length, status ); - /* null ObjectName, with or without RootDirectory */ + /* null attributes or ObjectName, with or without RootDirectory */ attr3.RootDirectory = 0; attr2.ObjectName = attr3.ObjectName = NULL; status = pNtCreateMutant( &ret, GENERIC_ALL, &attr2, FALSE ); @@ -674,91 +674,142 @@ static void test_name_limits(void) status = pNtCreateMutant( &ret, GENERIC_ALL, &attr3, FALSE ); ok( status == STATUS_SUCCESS, "NULL: NtCreateMutant failed %x\n", status ); pNtClose( ret ); + status = pNtCreateMutant( &ret, GENERIC_ALL, NULL, FALSE ); + ok( status == STATUS_SUCCESS, "NULL: NtCreateMutant failed %x\n", status ); + pNtClose( ret ); status = pNtOpenMutant( &ret, GENERIC_ALL, &attr2 ); ok( status == STATUS_OBJECT_NAME_INVALID, "NULL: NtOpenMutant failed %x\n", status ); status = pNtOpenMutant( &ret, GENERIC_ALL, &attr3 ); ok( status == STATUS_OBJECT_PATH_SYNTAX_BAD, "NULL: NtOpenMutant failed %x\n", status ); + status = pNtOpenMutant( &ret, GENERIC_ALL, NULL ); + ok( status == STATUS_INVALID_PARAMETER, "NULL: NtOpenMutant failed %x\n", status ); status = pNtCreateSemaphore( &ret, GENERIC_ALL, &attr2, 1, 2 ); ok( status == STATUS_OBJECT_NAME_INVALID, "NULL: NtCreateSemaphore failed %x\n", status ); status = pNtCreateSemaphore( &ret, GENERIC_ALL, &attr3, 1, 2 ); ok( status == STATUS_SUCCESS, "NULL: NtCreateSemaphore failed %x\n", status ); pNtClose( ret ); + status = pNtCreateSemaphore( &ret, GENERIC_ALL, NULL, 1, 2 ); + ok( status == STATUS_SUCCESS, "NULL: NtCreateSemaphore failed %x\n", status ); + pNtClose( ret ); status = pNtOpenSemaphore( &ret, GENERIC_ALL, &attr2 ); ok( status == STATUS_OBJECT_NAME_INVALID, "NULL: NtOpenSemaphore failed %x\n", status ); status = pNtOpenSemaphore( &ret, GENERIC_ALL, &attr3 ); ok( status == STATUS_OBJECT_PATH_SYNTAX_BAD, "NULL: NtOpenSemaphore failed %x\n", status ); + status = pNtOpenSemaphore( &ret, GENERIC_ALL, NULL ); + ok( status == STATUS_INVALID_PARAMETER, "NULL: NtOpenSemaphore failed %x\n", status ); status = pNtCreateEvent( &ret, GENERIC_ALL, &attr2, 1, 0 ); ok( status == STATUS_OBJECT_NAME_INVALID, "NULL: NtCreateEvent failed %x\n", status ); status = pNtCreateEvent( &ret, GENERIC_ALL, &attr3, 1, 0 ); ok( status == STATUS_SUCCESS, "NULL: NtCreateEvent failed %x\n", status ); pNtClose( ret ); + status = pNtCreateEvent( &ret, GENERIC_ALL, NULL, 1, 0 ); + ok( status == STATUS_SUCCESS, "NULL: NtCreateEvent failed %x\n", status ); + pNtClose( ret ); status = pNtOpenEvent( &ret, GENERIC_ALL, &attr2 ); ok( status == STATUS_OBJECT_NAME_INVALID, "NULL: NtOpenEvent failed %x\n", status ); status = pNtOpenEvent( &ret, GENERIC_ALL, &attr3 ); ok( status == STATUS_OBJECT_PATH_SYNTAX_BAD, "NULL: NtOpenEvent failed %x\n", status ); + status = pNtOpenEvent( &ret, GENERIC_ALL, NULL ); + ok( status == STATUS_INVALID_PARAMETER, "NULL: NtOpenEvent failed %x\n", status ); status = pNtCreateKeyedEvent( &ret, GENERIC_ALL, &attr2, 0 ); ok( status == STATUS_OBJECT_NAME_INVALID, "NULL: NtCreateKeyedEvent failed %x\n", status ); status = pNtCreateKeyedEvent( &ret, GENERIC_ALL, &attr3, 0 ); ok( status == STATUS_SUCCESS, "NULL: NtCreateKeyedEvent failed %x\n", status ); pNtClose( ret ); + status = pNtCreateKeyedEvent( &ret, GENERIC_ALL, NULL, 0 ); + ok( status == STATUS_SUCCESS, "NULL: NtCreateKeyedEvent failed %x\n", status ); + pNtClose( ret ); status = pNtOpenKeyedEvent( &ret, GENERIC_ALL, &attr2 ); ok( status == STATUS_OBJECT_NAME_INVALID, "NULL: NtOpenKeyedEvent failed %x\n", status ); status = pNtOpenKeyedEvent( &ret, GENERIC_ALL, &attr3 ); ok( status == STATUS_OBJECT_PATH_SYNTAX_BAD, "NULL: NtOpenKeyedEvent failed %x\n", status ); + status = pNtOpenKeyedEvent( &ret, GENERIC_ALL, NULL ); + ok( status == STATUS_INVALID_PARAMETER, "NULL: NtOpenKeyedEvent failed %x\n", status ); status = pNtCreateTimer( &ret, GENERIC_ALL, &attr2, NotificationTimer ); ok( status == STATUS_OBJECT_NAME_INVALID, "NULL: NtCreateTimer failed %x\n", status ); status = pNtCreateTimer( &ret, GENERIC_ALL, &attr3, NotificationTimer ); ok( status == STATUS_SUCCESS, "NULL: NtCreateTimer failed %x\n", status ); pNtClose( ret ); + status = pNtCreateTimer( &ret, GENERIC_ALL, NULL, NotificationTimer ); + ok( status == STATUS_SUCCESS, "NULL: NtCreateTimer failed %x\n", status ); + pNtClose( ret ); status = pNtOpenTimer( &ret, GENERIC_ALL, &attr2 ); ok( status == STATUS_OBJECT_NAME_INVALID, "NULL: NtOpenTimer failed %x\n", status ); status = pNtOpenTimer( &ret, GENERIC_ALL, &attr3 ); ok( status == STATUS_OBJECT_PATH_SYNTAX_BAD, "NULL: NtOpenTimer failed %x\n", status ); + status = pNtOpenTimer( &ret, GENERIC_ALL, NULL ); + ok( status == STATUS_INVALID_PARAMETER, "NULL: NtOpenTimer failed %x\n", status ); status = pNtCreateIoCompletion( &ret, GENERIC_ALL, &attr2, 0 ); ok( status == STATUS_OBJECT_NAME_INVALID, "NULL: NtCreateCompletion failed %x\n", status ); status = pNtCreateIoCompletion( &ret, GENERIC_ALL, &attr3, 0 ); ok( status == STATUS_SUCCESS, "NULL: NtCreateCompletion failed %x\n", status ); pNtClose( ret ); + status = pNtCreateIoCompletion( &ret, GENERIC_ALL, NULL, 0 ); + ok( status == STATUS_SUCCESS, "NULL: NtCreateCompletion failed %x\n", status ); + pNtClose( ret ); status = pNtOpenIoCompletion( &ret, GENERIC_ALL, &attr2 ); ok( status == STATUS_OBJECT_NAME_INVALID, "NULL: NtOpenCompletion failed %x\n", status ); status = pNtOpenIoCompletion( &ret, GENERIC_ALL, &attr3 ); ok( status == STATUS_OBJECT_PATH_SYNTAX_BAD, "NULL: NtOpenCompletion failed %x\n", status ); + status = pNtOpenIoCompletion( &ret, GENERIC_ALL, NULL ); + ok( status == STATUS_INVALID_PARAMETER, "NULL: NtOpenCompletion failed %x\n", status ); status = pNtCreateJobObject( &ret, GENERIC_ALL, &attr2 ); ok( status == STATUS_OBJECT_NAME_INVALID, "NULL: NtCreateJobObject failed %x\n", status ); status = pNtCreateJobObject( &ret, GENERIC_ALL, &attr3 ); ok( status == STATUS_SUCCESS, "NULL: NtCreateJobObject failed %x\n", status ); pNtClose( ret ); + status = pNtCreateJobObject( &ret, GENERIC_ALL, NULL ); + ok( status == STATUS_SUCCESS, "NULL: NtCreateJobObject failed %x\n", status ); + pNtClose( ret ); status = pNtOpenJobObject( &ret, GENERIC_ALL, &attr2 ); ok( status == STATUS_OBJECT_NAME_INVALID, "NULL: NtOpenJobObject failed %x\n", status ); status = pNtOpenJobObject( &ret, GENERIC_ALL, &attr3 ); ok( status == STATUS_OBJECT_PATH_SYNTAX_BAD, "NULL: NtOpenJobObject failed %x\n", status ); + status = pNtOpenJobObject( &ret, GENERIC_ALL, NULL ); + ok( status == STATUS_INVALID_PARAMETER, "NULL: NtOpenJobObject failed %x\n", status ); status = pNtCreateDirectoryObject( &ret, GENERIC_ALL, &attr2 ); ok( status == STATUS_OBJECT_NAME_INVALID, "NULL: NtCreateDirectoryObject failed %x\n", status ); status = pNtCreateDirectoryObject( &ret, GENERIC_ALL, &attr3 ); ok( status == STATUS_SUCCESS, "NULL: NtCreateDirectoryObject failed %x\n", status ); pNtClose( ret ); + status = pNtCreateDirectoryObject( &ret, GENERIC_ALL, NULL ); + ok( status == STATUS_SUCCESS, "NULL: NtCreateDirectoryObject failed %x\n", status ); + pNtClose( ret ); status = pNtOpenDirectoryObject( &ret, GENERIC_ALL, &attr2 ); ok( status == STATUS_OBJECT_NAME_INVALID, "NULL: NtOpenDirectoryObject failed %x\n", status ); status = pNtOpenDirectoryObject( &ret, GENERIC_ALL, &attr3 ); ok( status == STATUS_OBJECT_PATH_SYNTAX_BAD, "NULL: NtOpenDirectoryObject failed %x\n", status ); + status = pNtOpenDirectoryObject( &ret, GENERIC_ALL, NULL ); + ok( status == STATUS_INVALID_PARAMETER, "NULL: NtOpenDirectoryObject failed %x\n", status ); status = pNtCreateSymbolicLinkObject( &ret, GENERIC_ALL, &attr2, &target ); ok( status == STATUS_OBJECT_NAME_INVALID, "NULL: NtCreateSymbolicLinkObject failed %x\n", status ); status = pNtCreateSymbolicLinkObject( &ret, GENERIC_ALL, &attr3, &target ); ok( status == STATUS_SUCCESS, "NULL: NtCreateSymbolicLinkObject failed %x\n", status ); pNtClose( ret ); + status = pNtCreateSymbolicLinkObject( &ret, GENERIC_ALL, NULL, &target ); + ok( status == STATUS_ACCESS_VIOLATION || broken( status == STATUS_SUCCESS), /* winxp */ + "NULL: NtCreateSymbolicLinkObject failed %x\n", status ); + if (!status) pNtClose( ret ); status = pNtOpenSymbolicLinkObject( &ret, GENERIC_ALL, &attr2 ); ok( status == STATUS_OBJECT_NAME_INVALID, "NULL: NtOpenSymbolicLinkObject failed %x\n", status ); status = pNtOpenSymbolicLinkObject( &ret, GENERIC_ALL, &attr3 ); ok( status == STATUS_OBJECT_PATH_SYNTAX_BAD, "NULL: NtOpenSymbolicLinkObject failed %x\n", status ); + status = pNtOpenSymbolicLinkObject( &ret, GENERIC_ALL, NULL ); + ok( status == STATUS_INVALID_PARAMETER, "NULL: NtOpenSymbolicLinkObject failed %x\n", status ); status = pNtCreateSection( &ret, SECTION_MAP_WRITE, &attr2, &size, PAGE_READWRITE, SEC_COMMIT, 0 ); ok( status == STATUS_OBJECT_NAME_INVALID, "NULL: NtCreateSection failed %x\n", status ); status = pNtCreateSection( &ret, SECTION_MAP_WRITE, &attr3, &size, PAGE_READWRITE, SEC_COMMIT, 0 ); ok( status == STATUS_SUCCESS, "NULL: NtCreateSection failed %x\n", status ); pNtClose( ret ); + status = pNtCreateSection( &ret, SECTION_MAP_WRITE, NULL, &size, PAGE_READWRITE, SEC_COMMIT, 0 ); + ok( status == STATUS_SUCCESS, "NULL: NtCreateSection failed %x\n", status ); + pNtClose( ret ); status = pNtOpenSection( &ret, SECTION_MAP_WRITE, &attr2 ); ok( status == STATUS_OBJECT_NAME_INVALID, "NULL: NtOpenSection failed %x\n", status ); status = pNtOpenSection( &ret, SECTION_MAP_WRITE, &attr3 ); ok( status == STATUS_OBJECT_PATH_SYNTAX_BAD, "NULL: NtOpenSection failed %x\n", status ); + status = pNtOpenSection( &ret, SECTION_MAP_WRITE, NULL ); + ok( status == STATUS_INVALID_PARAMETER, "NULL: NtOpenSection failed %x\n", status ); attr2.ObjectName = attr3.ObjectName = &str; /* named pipes */ @@ -797,6 +848,9 @@ static void test_name_limits(void) FILE_CREATE, FILE_PIPE_FULL_DUPLEX, 0, 0, 0, 1, 256, 256, &timeout ); todo_wine ok( status == STATUS_OBJECT_PATH_SYNTAX_BAD, "NULL: NtCreateNamedPipeFile failed %x\n", status ); + status = pNtCreateNamedPipeFile( &ret, GENERIC_ALL, NULL, &iosb, FILE_SHARE_READ|FILE_SHARE_WRITE, + FILE_CREATE, FILE_PIPE_FULL_DUPLEX, 0, 0, 0, 1, 256, 256, &timeout ); + ok( status == STATUS_INVALID_PARAMETER, "NULL: NtCreateNamedPipeFile failed %x\n", status ); attr2.ObjectName = attr3.ObjectName = &str; /* mailslots */ @@ -821,10 +875,12 @@ static void test_name_limits(void) attr3.RootDirectory = 0; attr2.ObjectName = attr3.ObjectName = NULL; status = pNtCreateMailslotFile( &ret, GENERIC_ALL, &attr2, &iosb, 0, 0, 0, NULL ); - todo_wine ok( status == STATUS_OBJECT_NAME_INVALID, "NULL: NtCreateMailslotFile failed %x\n", status ); status = pNtCreateMailslotFile( &ret, GENERIC_ALL, &attr3, &iosb, 0, 0, 0, NULL ); + todo_wine ok( status == STATUS_OBJECT_PATH_SYNTAX_BAD, "NULL: NtCreateMailslotFile failed %x\n", status ); + status = pNtCreateMailslotFile( &ret, GENERIC_ALL, NULL, &iosb, 0, 0, 0, NULL ); + ok( status == STATUS_INVALID_PARAMETER, "NULL: NtCreateMailslotFile failed %x\n", status ); attr2.ObjectName = attr3.ObjectName = &str; /* registry keys */ @@ -928,11 +984,15 @@ static void test_name_limits(void) status = pNtCreateKey( &ret, GENERIC_ALL, &attr3, 0, NULL, 0, NULL ); todo_wine ok( status == STATUS_ACCESS_VIOLATION, "NULL: NtCreateKey failed %x\n", status ); + status = pNtCreateKey( &ret, GENERIC_ALL, NULL, 0, NULL, 0, NULL ); + ok( status == STATUS_ACCESS_VIOLATION, "NULL: NtCreateKey failed %x\n", status ); status = pNtOpenKey( &ret, GENERIC_ALL, &attr2 ); ok( status == STATUS_ACCESS_VIOLATION || status == STATUS_INVALID_HANDLE, "NULL: NtOpenKey failed %x\n", status ); status = pNtOpenKey( &ret, GENERIC_ALL, &attr3 ); ok( status == STATUS_ACCESS_VIOLATION, "NULL: NtOpenKey failed %x\n", status ); + status = pNtOpenKey( &ret, GENERIC_ALL, NULL ); + ok( status == STATUS_ACCESS_VIOLATION, "NULL: NtOpenKey failed %x\n", status ); attr2.ObjectName = attr3.ObjectName = &str; pRtlFreeUnicodeString( &str ); -- 2.33.8