summaryrefslogtreecommitdiffstats
path: root/base/message_pump_libevent.cc
diff options
context:
space:
mode:
authorjeremy@chromium.org <jeremy@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-09-23 17:56:25 +0000
committerjeremy@chromium.org <jeremy@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-09-23 17:56:25 +0000
commit052fd4554b97d509ac2dba629bff9372a49a4e97 (patch)
tree7611171c279d8e342a229c7469de62ea2a941698 /base/message_pump_libevent.cc
parent2099006be6b45f5dd976728b2c866666434aeea0 (diff)
downloadchromium_src-052fd4554b97d509ac2dba629bff9372a49a4e97.zip
chromium_src-052fd4554b97d509ac2dba629bff9372a49a4e97.tar.gz
chromium_src-052fd4554b97d509ac2dba629bff9372a49a4e97.tar.bz2
IPC & LibEvent fix
* Allow IPC::Listeners to send a message on OnChannelConnected. * Fix a bug in MessagePumpLibevent::WatchFileDescriptor causing a read-after-free. BUG=22451 Review URL: http://codereview.chromium.org/209061 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@26946 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/message_pump_libevent.cc')
-rw-r--r--base/message_pump_libevent.cc17
1 files changed, 17 insertions, 0 deletions
diff --git a/base/message_pump_libevent.cc b/base/message_pump_libevent.cc
index a940081..e6d2cea 100644
--- a/base/message_pump_libevent.cc
+++ b/base/message_pump_libevent.cc
@@ -171,6 +171,23 @@ bool MessagePumpLibevent::WatchFileDescriptor(int fd,
should_delete_event = false;
// Ownership is transferred to the controller.
evt.reset(new event);
+ } else {
+ // It's illegal to use this function to listen on 2 separate fds with the
+ // same |controller|.
+ if (EVENT_FD(evt.get()) != fd) {
+ NOTREACHED() << "FDs don't match" << EVENT_FD(evt.get()) << "!=" << fd;
+ return false;
+ }
+
+ // Make sure we don't pick up any funky internal libevent masks.
+ int old_interest_mask = evt.get()->ev_events &
+ (EV_READ | EV_WRITE | EV_PERSIST);
+
+ // Combine old/new event masks.
+ event_mask |= old_interest_mask;
+
+ // Must disarm the event before we can reuse it.
+ event_del(evt.get());
}
// Set current interest mask and message pump for this event.