diff options
author | sky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-01-27 20:14:10 +0000 |
---|---|---|
committer | sky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-01-27 20:14:10 +0000 |
commit | 6cbf718e873eca34359cae7c220c408385fbc0b1 (patch) | |
tree | 9b0aea1c65804e351fd98368dfdd02a90cdd296d /chrome | |
parent | 00ad5cd4580cb8184a641d771a113abb0ab7ef4c (diff) | |
download | chromium_src-6cbf718e873eca34359cae7c220c408385fbc0b1.zip chromium_src-6cbf718e873eca34359cae7c220c408385fbc0b1.tar.gz chromium_src-6cbf718e873eca34359cae7c220c408385fbc0b1.tar.bz2 |
Fixes unintialized read in networkmenu. Menu's constructor calls into
the delegate, making using 'this' in the member intializer list for
creating a menu problematic. I've changed it to a scoped_ptr and
created as needed.
BUG=none
TEST=none
Review URL: http://codereview.chromium.org/552187
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@37298 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r-- | chrome/browser/chromeos/clock_menu_button.cc | 10 | ||||
-rw-r--r-- | chrome/browser/chromeos/clock_menu_button.h | 5 |
2 files changed, 10 insertions, 5 deletions
diff --git a/chrome/browser/chromeos/clock_menu_button.cc b/chrome/browser/chromeos/clock_menu_button.cc index 98af0b4..745fe24 100644 --- a/chrome/browser/chromeos/clock_menu_button.cc +++ b/chrome/browser/chromeos/clock_menu_button.cc @@ -26,7 +26,6 @@ const int kTimerSlopSeconds = 1; ClockMenuButton::ClockMenuButton(Browser* browser) : MenuButton(NULL, std::wstring(), this, false), - clock_menu_(this), browser_(browser) { set_border(NULL); SetFont(ResourceBundle::GetSharedInstance().GetFont( @@ -141,9 +140,12 @@ void ClockMenuButton::ActivatedAt(int index) { // ClockMenuButton, views::ViewMenuDelegate implementation: void ClockMenuButton::RunMenu(views::View* source, const gfx::Point& pt) { - clock_menu_.Rebuild(); - clock_menu_.UpdateStates(); - clock_menu_.RunMenuAt(pt, views::Menu2::ALIGN_TOPRIGHT); + if (!clock_menu_.get()) + clock_menu_.reset(new views::Menu2(this)); + else + clock_menu_->Rebuild(); + clock_menu_->UpdateStates(); + clock_menu_->RunMenuAt(pt, views::Menu2::ALIGN_TOPRIGHT); } } // namespace chromeos diff --git a/chrome/browser/chromeos/clock_menu_button.h b/chrome/browser/chromeos/clock_menu_button.h index a720302..b3d0543 100644 --- a/chrome/browser/chromeos/clock_menu_button.h +++ b/chrome/browser/chromeos/clock_menu_button.h @@ -5,6 +5,7 @@ #ifndef CHROME_BROWSER_CHROMEOS_CLOCK_MENU_BUTTON_H_ #define CHROME_BROWSER_CHROMEOS_CLOCK_MENU_BUTTON_H_ +#include "base/scoped_ptr.h" #include "base/timer.h" #include "chrome/common/notification_observer.h" #include "chrome/common/pref_member.h" @@ -67,7 +68,9 @@ class ClockMenuButton : public views::MenuButton, StringPrefMember timezone_; // The clock menu. - views::Menu2 clock_menu_; + // NOTE: we use a scoped_ptr here as menu calls into 'this' from the + // constructor. + scoped_ptr<views::Menu2> clock_menu_; // The browser object. Can be NULL if the button is on the login manager // screen. |