From 798f6fbfd9259318e1d2c20765b1be07674b5328 Mon Sep 17 00:00:00 2001 From: "tommi@chromium.org" Date: Fri, 31 Dec 2010 03:43:51 +0000 Subject: Handling a case in DeleteRegValueWorkItem where it would report a failure if a key holding the value doesn't exist. TEST=Fixes an issue with installing chrome frame that came up when the ready-mode support was checked in. BUG=none Review URL: http://codereview.chromium.org/6013008 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@70332 0039d316-1c4b-4281-b951-d872f2087c98 --- chrome/installer/util/delete_reg_value_work_item.cc | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) (limited to 'chrome') diff --git a/chrome/installer/util/delete_reg_value_work_item.cc b/chrome/installer/util/delete_reg_value_work_item.cc index e663eef..5b0496d 100644 --- a/chrome/installer/util/delete_reg_value_work_item.cc +++ b/chrome/installer/util/delete_reg_value_work_item.cc @@ -32,8 +32,25 @@ bool DeleteRegValueWorkItem::Do() { return false; } - RegKey key; status_ = VALUE_UNCHANGED; + + // A big flaw in the RegKey implementation is that all error information + // (besides success/failure) is lost in the translation from LSTATUS to bool. + // So, we resort to direct API calls here. :-/ + HKEY raw_key = NULL; + LSTATUS err = RegOpenKeyEx(predefined_root_, key_path_.c_str(), 0, + KEY_READ, &raw_key); + if (err != ERROR_SUCCESS) { + if (err == ERROR_FILE_NOT_FOUND) { + LOG(INFO) << "(delete value) can not open " << key_path_; + status_ = VALUE_NOT_FOUND; + return true; + } + } else { + ::RegCloseKey(raw_key); + } + + RegKey key; bool result = false; if (!key.Open(predefined_root_, key_path_.c_str(), KEY_READ | KEY_WRITE)) { LOG(ERROR) << "can not open " << key_path_; @@ -52,7 +69,6 @@ bool DeleteRegValueWorkItem::Do() { LOG(ERROR) << "failed to read/delete value " << value_name_; } - key.Close(); return result; } -- cgit v1.1