Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(170)

Side by Side Diff: chrome/browser/ui/webui/help/version_updater_win.cc

Issue 15649007: Attempt to fix use-after-free in VersionUpdaterWin. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: one more spot Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/memory/ref_counted.h" 5 #include "base/memory/ref_counted.h"
6 #include "base/memory/scoped_ptr.h" 6 #include "base/memory/scoped_ptr.h"
7 #include "base/memory/weak_ptr.h" 7 #include "base/memory/weak_ptr.h"
8 #include "base/string16.h" 8 #include "base/string16.h"
9 #include "base/version.h" 9 #include "base/version.h"
10 #include "base/win/windows_version.h" 10 #include "base/win/windows_version.h"
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
55 GoogleUpdateErrorCode error_code, 55 GoogleUpdateErrorCode error_code,
56 const string16& error_message); 56 const string16& error_message);
57 57
58 // Got the intalled version so the handling of the UPGRADE_ALREADY_UP_TO_DATE 58 // Got the intalled version so the handling of the UPGRADE_ALREADY_UP_TO_DATE
59 // result case can now be completeb on the UI thread. 59 // result case can now be completeb on the UI thread.
60 void GotInstalledVersion(const Version& version); 60 void GotInstalledVersion(const Version& version);
61 61
62 // Little helper function to reset google_updater_. 62 // Little helper function to reset google_updater_.
63 void SetGoogleUpdater(); 63 void SetGoogleUpdater();
64 64
65 // Helper function to clear google_updater_.
66 void ClearGoogleUpdater();
67
65 // Returns a window that can be used for elevation. 68 // Returns a window that can be used for elevation.
66 HWND GetElevationParent(); 69 HWND GetElevationParent();
67 70
68 // The class that communicates with Google Update to find out if an update is 71 // The class that communicates with Google Update to find out if an update is
69 // available and asks it to start an upgrade. 72 // available and asks it to start an upgrade.
70 scoped_refptr<GoogleUpdate> google_updater_; 73 scoped_refptr<GoogleUpdate> google_updater_;
71 74
72 // Used for callbacks. 75 // Used for callbacks.
73 base::WeakPtrFactory<VersionUpdaterWin> weak_factory_; 76 base::WeakPtrFactory<VersionUpdaterWin> weak_factory_;
74 77
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
120 }; 123 };
121 124
122 VersionUpdaterWin::VersionUpdaterWin() 125 VersionUpdaterWin::VersionUpdaterWin()
123 : weak_factory_(this) { 126 : weak_factory_(this) {
124 SetGoogleUpdater(); 127 SetGoogleUpdater();
125 } 128 }
126 129
127 VersionUpdaterWin::~VersionUpdaterWin() { 130 VersionUpdaterWin::~VersionUpdaterWin() {
128 // The Google Updater will hold a pointer to the listener until it reports 131 // The Google Updater will hold a pointer to the listener until it reports
129 // status, so that pointer must be cleared when the listener is destoyed. 132 // status, so that pointer must be cleared when the listener is destoyed.
130 if (google_updater_) 133 ClearGoogleUpdater();
131 google_updater_->set_status_listener(NULL);
132 } 134 }
133 135
134 void VersionUpdaterWin::CheckForUpdate(const StatusCallback& callback) { 136 void VersionUpdaterWin::CheckForUpdate(const StatusCallback& callback) {
135 callback_ = callback; 137 callback_ = callback;
136 138
137 // On-demand updates for Chrome don't work in Vista RTM when UAC is turned 139 // On-demand updates for Chrome don't work in Vista RTM when UAC is turned
138 // off. So, in this case, the version updater must not mention 140 // off. So, in this case, the version updater must not mention
139 // on-demand updates. Silent updates (in the background) should still 141 // on-demand updates. Silent updates (in the background) should still
140 // work as before - enabling UAC or installing the latest service pack 142 // work as before - enabling UAC or installing the latest service pack
141 // for Vista is another option. 143 // for Vista is another option.
(...skipping 10 matching lines...) Expand all
152 } 154 }
153 155
154 void VersionUpdaterWin::RelaunchBrowser() const { 156 void VersionUpdaterWin::RelaunchBrowser() const {
155 chrome::AttemptRestart(); 157 chrome::AttemptRestart();
156 } 158 }
157 159
158 void VersionUpdaterWin::OnReportResults( 160 void VersionUpdaterWin::OnReportResults(
159 GoogleUpdateUpgradeResult result, GoogleUpdateErrorCode error_code, 161 GoogleUpdateUpgradeResult result, GoogleUpdateErrorCode error_code,
160 const string16& error_message, const string16& version) { 162 const string16& error_message, const string16& version) {
161 // Drop the last reference to the object so that it gets cleaned up here. 163 // Drop the last reference to the object so that it gets cleaned up here.
162 google_updater_ = NULL; 164 ClearGoogleUpdater();
163 UpdateStatus(result, error_code, error_message); 165 UpdateStatus(result, error_code, error_message);
164 } 166 }
165 167
166 void VersionUpdaterWin::UpdateStatus(GoogleUpdateUpgradeResult result, 168 void VersionUpdaterWin::UpdateStatus(GoogleUpdateUpgradeResult result,
167 GoogleUpdateErrorCode error_code, 169 GoogleUpdateErrorCode error_code,
168 const string16& error_message) { 170 const string16& error_message) {
169 // For Chromium builds it would show an error message. 171 // For Chromium builds it would show an error message.
170 // But it looks weird because in fact there is no error, 172 // But it looks weird because in fact there is no error,
171 // just the update server is not available for non-official builds. 173 // just the update server is not available for non-official builds.
172 #if defined(GOOGLE_CHROME_BUILD) 174 #if defined(GOOGLE_CHROME_BUILD)
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
249 if (!version.IsValid() || version.CompareTo(running_version) <= 0) { 251 if (!version.IsValid() || version.CompareTo(running_version) <= 0) {
250 content::RecordAction( 252 content::RecordAction(
251 UserMetricsAction("UpgradeCheck_AlreadyUpToDate")); 253 UserMetricsAction("UpgradeCheck_AlreadyUpToDate"));
252 callback_.Run(UPDATED, 0, string16()); 254 callback_.Run(UPDATED, 0, string16());
253 } else { 255 } else {
254 content::RecordAction(UserMetricsAction("UpgradeCheck_AlreadyUpgraded")); 256 content::RecordAction(UserMetricsAction("UpgradeCheck_AlreadyUpgraded"));
255 callback_.Run(NEARLY_UPDATED, 0, string16()); 257 callback_.Run(NEARLY_UPDATED, 0, string16());
256 } 258 }
257 } 259 }
258 260
259 void VersionUpdaterWin::SetGoogleUpdater() { 261 void VersionUpdaterWin::SetGoogleUpdater() {
MAD 2013/05/28 19:37:06 While you are there, maybe we should rename this t
grt (UTC plus 2) 2013/05/28 19:49:09 Nice idea. I went for "CreateGoogleUpdater". SGTY?
262 ClearGoogleUpdater();
260 google_updater_ = new GoogleUpdate(); 263 google_updater_ = new GoogleUpdate();
261 google_updater_->set_status_listener(this); 264 google_updater_->set_status_listener(this);
262 } 265 }
263 266
267 void VersionUpdaterWin::ClearGoogleUpdater() {
268 if (google_updater_) {
269 google_updater_->set_status_listener(NULL);
270 google_updater_ = NULL;
271 }
272 }
273
264 BOOL CALLBACK WindowEnumeration(HWND window, LPARAM param) { 274 BOOL CALLBACK WindowEnumeration(HWND window, LPARAM param) {
265 if (IsWindowVisible(window)) { 275 if (IsWindowVisible(window)) {
266 HWND* returned_window = reinterpret_cast<HWND*>(param); 276 HWND* returned_window = reinterpret_cast<HWND*>(param);
267 *returned_window = window; 277 *returned_window = window;
268 return FALSE; 278 return FALSE;
269 } 279 }
270 return TRUE; 280 return TRUE;
271 } 281 }
272 282
273 HWND VersionUpdaterWin::GetElevationParent() { 283 HWND VersionUpdaterWin::GetElevationParent() {
(...skipping 10 matching lines...) Expand all
284 << GetCurrentThreadId(); 294 << GetCurrentThreadId();
285 #endif 295 #endif
286 return window; 296 return window;
287 } 297 }
288 298
289 } // namespace 299 } // namespace
290 300
291 VersionUpdater* VersionUpdater::Create() { 301 VersionUpdater* VersionUpdater::Create() {
292 return new VersionUpdaterWin; 302 return new VersionUpdaterWin;
293 } 303 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698