diff options
author | jschuh@chromium.org <jschuh@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-07-01 05:10:55 +0000 |
---|---|---|
committer | jschuh@chromium.org <jschuh@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-07-01 05:10:55 +0000 |
commit | 855b53a0bfe5039065f3795633c0b6f6c8e060f2 (patch) | |
tree | 9be39ace797304dd0afd7bbfda82cd8431ba24f4 /sandbox | |
parent | 597516370da37bcd593e06f9369aa31c432013f9 (diff) | |
download | chromium_src-855b53a0bfe5039065f3795633c0b6f6c8e060f2.zip chromium_src-855b53a0bfe5039065f3795633c0b6f6c8e060f2.tar.gz chromium_src-855b53a0bfe5039065f3795633c0b6f6c8e060f2.tar.bz2 |
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.*
Review URL: http://codereview.chromium.org/7218066
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@91270 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'sandbox')
-rw-r--r-- | sandbox/src/handle_table.cc | 38 | ||||
-rw-r--r-- | sandbox/src/handle_table.h | 4 | ||||
-rw-r--r-- | sandbox/src/handle_table_unittest.cc | 4 |
3 files changed, 32 insertions, 14 deletions
diff --git a/sandbox/src/handle_table.cc b/sandbox/src/handle_table.cc index c7fcf0a..a18fe2c 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<UNICODE_STRING> name; - do { - name.reset(reinterpret_cast<UNICODE_STRING*>(new BYTE[size])); - result = QueryObject(reinterpret_cast<HANDLE>( - 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>(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<UNICODE_STRING> name; + NTSTATUS result; + + do { + name.reset(reinterpret_cast<UNICODE_STRING*>(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..08b4cb6 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..1e8ddcb 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_EQ(sandbox::GetHandleName(file, &handle_name), true); // 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; } |