From b0fa4c62d07643cf212eccb4152ad38cffa55c97 Mon Sep 17 00:00:00 2001 From: "jschuh@chromium.org" Date: Wed, 13 Jul 2011 20:21:04 +0000 Subject: Had a bug in the handle table unit test. Added GetHandleName to fix the bug and make handle management easier. TEST=sbox_unittests --gtest_filter=HandleTable.* Committed: http://src.chromium.org/viewvc/chrome?view=rev&revision=91270 Review URL: http://codereview.chromium.org/7218066 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@92403 0039d316-1c4b-4281-b951-d872f2087c98 --- sandbox/src/handle_table.cc | 38 ++++++++++++++++++++++++------------ sandbox/src/handle_table.h | 4 ++++ sandbox/src/handle_table_unittest.cc | 4 +++- 3 files changed, 32 insertions(+), 14 deletions(-) (limited to 'sandbox') diff --git a/sandbox/src/handle_table.cc b/sandbox/src/handle_table.cc index c7fcf0a..90501a8 100644 --- a/sandbox/src/handle_table.cc +++ b/sandbox/src/handle_table.cc @@ -17,6 +17,8 @@ bool CompareHandleEntries(const SYSTEM_HANDLE_INFORMATION& a, return a.ProcessId < b.ProcessId; } +static NtQueryObject QueryObject = NULL; + } // namespace namespace sandbox { @@ -84,7 +86,6 @@ HandleTable::HandleEntry::HandleEntry( } void HandleTable::HandleEntry::UpdateInfo(UpdateType flag) { - static NtQueryObject QueryObject = NULL; if (!QueryObject) ResolveNTFunctionPtr("NtQueryObject", &QueryObject); @@ -119,18 +120,8 @@ void HandleTable::HandleEntry::UpdateInfo(UpdateType flag) { switch (flag) { case UPDATE_INFO_AND_NAME: if (type_info_buffer_.size() && handle_name_.empty()) { - ULONG size = MAX_PATH; - scoped_ptr name; - do { - name.reset(reinterpret_cast(new BYTE[size])); - result = QueryObject(reinterpret_cast( - handle_entry_->Handle), ObjectNameInformation, name.get(), - size, &size); - } while (result == STATUS_INFO_LENGTH_MISMATCH); - - if (NT_SUCCESS(result)) { - handle_name_.assign(name->Buffer, name->Length / sizeof(wchar_t)); - } + GetHandleName(reinterpret_cast(handle_entry_->Handle), + &handle_name_); } break; @@ -144,6 +135,27 @@ void HandleTable::HandleEntry::UpdateInfo(UpdateType flag) { } } +// Returns the object manager's name associated with a handle +BOOL GetHandleName(HANDLE handle, string16* handle_name) { + if (!QueryObject) + ResolveNTFunctionPtr("NtQueryObject", &QueryObject); + + ULONG size = MAX_PATH; + scoped_ptr name; + NTSTATUS result; + + do { + name.reset(reinterpret_cast(new BYTE[size])); + result = QueryObject(handle, ObjectNameInformation, name.get(), + size, &size); + } while (result == STATUS_INFO_LENGTH_MISMATCH); + + if (NT_SUCCESS(result)) + handle_name->assign(name->Buffer, name->Length / sizeof(wchar_t)); + + return NT_SUCCESS(result); +} + const OBJECT_TYPE_INFORMATION* HandleTable::HandleEntry::TypeInfo() { UpdateInfo(UPDATE_INFO_ONLY); return type_info_buffer_.empty() ? NULL : type_info_internal(); diff --git a/sandbox/src/handle_table.h b/sandbox/src/handle_table.h index 9b1fc66..4814aab 100644 --- a/sandbox/src/handle_table.h +++ b/sandbox/src/handle_table.h @@ -155,6 +155,10 @@ class HandleTable { DISALLOW_COPY_AND_ASSIGN(HandleTable); }; +// Returns the object manager's name associated with a handle +BOOL GetHandleName(HANDLE handle, string16* handle_name); + + } // namespace sandbox #endif // SANDBOX_SRC_HANDLE_TABLE_H_ diff --git a/sandbox/src/handle_table_unittest.cc b/sandbox/src/handle_table_unittest.cc index 696037f..3977c4a 100644 --- a/sandbox/src/handle_table_unittest.cc +++ b/sandbox/src/handle_table_unittest.cc @@ -47,6 +47,8 @@ TEST(HandleTable, FindHandle) { FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, NULL); EXPECT_NE(INVALID_HANDLE_VALUE, file); + string16 handle_name; + ASSERT_NE(sandbox::GetHandleName(file, &handle_name), FALSE); // Look for the handle in our process bool handle_found = false; @@ -54,7 +56,7 @@ TEST(HandleTable, FindHandle) { for (HandleTable::Iterator it = handles.HandlesForProcess(::GetCurrentProcessId()); it != handles.end(); ++it) { - if (it->IsType(HandleTable::kTypeFile) && it->Name().compare(my_file)) { + if (it->IsType(HandleTable::kTypeFile) && it->Name() == handle_name) { handle_found = true; break; } -- cgit v1.1