From d7a9328f5d93b8877d2e7ff34093537b39a3108b Mon Sep 17 00:00:00 2001 From: "agl@chromium.org" Date: Fri, 26 Feb 2010 19:44:09 +0000 Subject: Fix the case where the browser livelocks if we cannot open a file. If one tries to upload a file that one doesn't have read access to, the browser livelocks. It tries to read from the file, gets nothing but spins forever because it knows that it hasn't finished reading. To address this, firstly we add a check at stat() time to make sure that we can read the file. However, this doesn't take care of the case where the access() call was incorrect, or the permissions have changed under us. In this case, we replace the missing file with NULs. (Land attempt three: first in r39446, reverted in r39448. Second in r39899, reverted in r39901.) http://codereview.chromium.org/541022 BUG=30850 TEST=Try to upload a file that isn't readable (i.e. /etc/shadow). The resulting upload should be a 0 byte file. git-svn-id: svn://svn.chromium.org/chrome/trunk/src@40146 0039d316-1c4b-4281-b951-d872f2087c98 --- chrome_frame/chrome_frame_delegate.h | 37 ------------------------------------ 1 file changed, 37 deletions(-) (limited to 'chrome_frame') diff --git a/chrome_frame/chrome_frame_delegate.h b/chrome_frame/chrome_frame_delegate.h index 93d4645..11eaa30 100644 --- a/chrome_frame/chrome_frame_delegate.h +++ b/chrome_frame/chrome_frame_delegate.h @@ -7,9 +7,7 @@ #include #include -#include -#include "base/lock.h" #include "chrome/test/automation/automation_messages.h" #include "ipc/ipc_message.h" @@ -127,35 +125,15 @@ class TaskMarshaller { template class TaskMarshallerThroughWindowsMessages : public TaskMarshaller { public: - TaskMarshallerThroughWindowsMessages() {} virtual void PostTask(const tracked_objects::Location& from_here, Task* task) { task->SetBirthPlace(from_here); T* this_ptr = static_cast(this); if (this_ptr->IsWindow()) { this_ptr->AddRef(); - PushTask(task); this_ptr->PostMessage(MSG_EXECUTE_TASK, reinterpret_cast(task)); } else { DLOG(INFO) << "Dropping MSG_EXECUTE_TASK message for destroyed window."; - delete task; - } - } - - - protected: - ~TaskMarshallerThroughWindowsMessages() { - DeleteAllPendingTasks(); - } - - void DeleteAllPendingTasks() { - AutoLock lock(lock_); - DLOG_IF(INFO, !pending_tasks_.empty()) << "Destroying " << - pending_tasks_.size() << " pending tasks"; - while (!pending_tasks_.empty()) { - Task* task = pending_tasks_.front(); - pending_tasks_.pop(); - delete task; } } @@ -168,27 +146,12 @@ template class TaskMarshallerThroughWindowsMessages inline LRESULT ExecuteTask(UINT, WPARAM wparam, LPARAM, BOOL& handled) { // NOLINT Task* task = reinterpret_cast(wparam); - PopTask(task); task->Run(); delete task; T* this_ptr = static_cast(this); this_ptr->Release(); return 0; } - - inline void PushTask(Task* task) { - AutoLock lock(lock_); - pending_tasks_.push(task); - } - - inline void PopTask(Task* task) { - AutoLock lock(lock_); - DCHECK_EQ(task, pending_tasks_.front()); - pending_tasks_.pop(); - } - - Lock lock_; - std::queue pending_tasks_; }; #endif // CHROME_FRAME_CHROME_FRAME_DELEGATE_H_ -- cgit v1.1