summaryrefslogtreecommitdiff
path: root/libchrome_tools/patches/components-timers-fix-fd-leak-in-AlarmTimer.patch
diff options
context:
space:
mode:
Diffstat (limited to 'libchrome_tools/patches/components-timers-fix-fd-leak-in-AlarmTimer.patch')
-rw-r--r--libchrome_tools/patches/components-timers-fix-fd-leak-in-AlarmTimer.patch102
1 files changed, 102 insertions, 0 deletions
diff --git a/libchrome_tools/patches/components-timers-fix-fd-leak-in-AlarmTimer.patch b/libchrome_tools/patches/components-timers-fix-fd-leak-in-AlarmTimer.patch
new file mode 100644
index 0000000000..e98c6918dc
--- /dev/null
+++ b/libchrome_tools/patches/components-timers-fix-fd-leak-in-AlarmTimer.patch
@@ -0,0 +1,102 @@
+From e18f110107399803dd070088c601f9a5540a2a3f Mon Sep 17 00:00:00 2001
+From: Hidehiko Abe <hidehiko@chromium.org>
+Date: Thu, 3 Oct 2019 02:04:53 +0900
+Subject: [PATCH] components/timers: fix fd leak in AlarmTimer
+
+This is fixed upstream but will take a while to roll back
+into Chrome OS.
+
+BUG=chromium:984593
+TEST=enable/disable wifi repeatedly and see that there is no
+ growth of open timerfds
+
+Change-Id: If2af8f8ddf6b9dc31cda36fe5f5454ca0c5819de
+---
+ components/timers/alarm_timer_chromeos.cc | 8 ++++----
+ components/timers/alarm_timer_chromeos.h | 15 ++++++++-------
+ 2 files changed, 12 insertions(+), 11 deletions(-)
+
+diff --git a/components/timers/alarm_timer_chromeos.cc b/components/timers/alarm_timer_chromeos.cc
+index 0b43134..f14d889 100644
+--- a/components/timers/alarm_timer_chromeos.cc
++++ b/components/timers/alarm_timer_chromeos.cc
+@@ -80,7 +80,7 @@ void SimpleAlarmTimer::Reset() {
+ alarm_time.it_value.tv_nsec =
+ (delay.InMicroseconds() % base::Time::kMicrosecondsPerSecond) *
+ base::Time::kNanosecondsPerMicrosecond;
+- if (timerfd_settime(alarm_fd_, 0, &alarm_time, NULL) < 0)
++ if (timerfd_settime(alarm_fd_.get(), 0, &alarm_time, NULL) < 0)
+ PLOG(ERROR) << "Error while setting alarm time. Timer will not fire";
+
+ // The timer is running.
+@@ -97,7 +97,7 @@ void SimpleAlarmTimer::Reset() {
+ base::debug::TaskAnnotator().WillQueueTask("SimpleAlarmTimer::Reset",
+ pending_task_.get());
+ alarm_fd_watcher_ = base::FileDescriptorWatcher::WatchReadable(
+- alarm_fd_,
++ alarm_fd_.get(),
+ base::BindRepeating(&SimpleAlarmTimer::OnAlarmFdReadableWithoutBlocking,
+ weak_factory_.GetWeakPtr()));
+ }
+@@ -109,7 +109,7 @@ void SimpleAlarmTimer::OnAlarmFdReadableWithoutBlocking() {
+
+ // Read from |alarm_fd_| to ack the event.
+ char val[sizeof(uint64_t)];
+- if (!base::ReadFromFD(alarm_fd_, val, sizeof(uint64_t)))
++ if (!base::ReadFromFD(alarm_fd_.get(), val, sizeof(uint64_t)))
+ PLOG(DFATAL) << "Unable to read from timer file descriptor.";
+
+ OnTimerFired();
+@@ -137,7 +137,7 @@ void SimpleAlarmTimer::OnTimerFired() {
+ }
+
+ bool SimpleAlarmTimer::CanWakeFromSuspend() const {
+- return alarm_fd_ != -1;
++ return alarm_fd_.is_valid();
+ }
+
+ } // namespace timers
+diff --git a/components/timers/alarm_timer_chromeos.h b/components/timers/alarm_timer_chromeos.h
+index 1ff689e..100ba81 100644
+--- a/components/timers/alarm_timer_chromeos.h
++++ b/components/timers/alarm_timer_chromeos.h
+@@ -8,6 +8,7 @@
+ #include <memory>
+
+ #include "base/files/file_descriptor_watcher_posix.h"
++#include "base/files/scoped_file.h"
+ #include "base/macros.h"
+ #include "base/memory/scoped_refptr.h"
+ #include "base/memory/weak_ptr.h"
+@@ -43,6 +44,12 @@ class SimpleAlarmTimer : public base::RetainingOneShotTimer {
+ void Stop() override;
+ void Reset() override;
+
++ // Tracks whether the timer has the ability to wake the system up from
++ // suspend. This is a runtime check because we won't know if the system
++ // supports being woken up from suspend until the constructor actually tries
++ // to set it up.
++ bool CanWakeFromSuspend() const;
++
+ private:
+ // Called when |alarm_fd_| is readable without blocking. Reads data from
+ // |alarm_fd_| and calls OnTimerFired().
+@@ -51,14 +58,8 @@ class SimpleAlarmTimer : public base::RetainingOneShotTimer {
+ // Called when the timer fires. Runs the callback.
+ void OnTimerFired();
+
+- // Tracks whether the timer has the ability to wake the system up from
+- // suspend. This is a runtime check because we won't know if the system
+- // supports being woken up from suspend until the constructor actually tries
+- // to set it up.
+- bool CanWakeFromSuspend() const;
+-
+ // Timer file descriptor.
+- const int alarm_fd_;
++ base::ScopedFD alarm_fd_;
+
+ // Watches |alarm_fd_|.
+ std::unique_ptr<base::FileDescriptorWatcher::Controller> alarm_fd_watcher_;
+--
+2.23.0.581.g78d2f28ef7-goog
+