| Index: runtime/bin/process_win.cc
 | 
| diff --git a/runtime/bin/process_win.cc b/runtime/bin/process_win.cc
 | 
| index a2d93a4babcc9bc74f89fbd23f01bc6c32cd07a9..c0cb06bb3306030c87574cc66a9a89f83a8227f1 100644
 | 
| --- a/runtime/bin/process_win.cc
 | 
| +++ b/runtime/bin/process_win.cc
 | 
| @@ -714,32 +714,35 @@ class BufferList : public BufferListBase {
 | 
|    // overlapped read.
 | 
|    void DataIsRead(intptr_t size) {
 | 
|      ASSERT(read_pending_ == true);
 | 
| -    data_size_ += size;
 | 
| -    free_size_ -= size;
 | 
| -    ASSERT(free_size_ >= 0);
 | 
| +    set_data_size(data_size() + size);
 | 
| +    set_free_size(free_size() - size);
 | 
| +    ASSERT(free_size() >= 0);
 | 
|      read_pending_ = false;
 | 
|    }
 | 
|  
 | 
|    // The access to the read buffer for overlapped read.
 | 
| -  void GetReadBuffer(uint8_t** buffer, intptr_t* size) {
 | 
| +  bool GetReadBuffer(uint8_t** buffer, intptr_t* size) {
 | 
|      ASSERT(!read_pending_);
 | 
| -    if (free_size_ == 0) {
 | 
| -      Allocate();
 | 
| +    if (free_size() == 0) {
 | 
| +      if (!Allocate()) {
 | 
| +        return false;
 | 
| +      }
 | 
|      }
 | 
| -    ASSERT(free_size_ > 0);
 | 
| -    ASSERT(free_size_ <= kBufferSize);
 | 
| +    ASSERT(free_size() > 0);
 | 
| +    ASSERT(free_size() <= kBufferSize);
 | 
|      *buffer = FreeSpaceAddress();
 | 
| -    *size = free_size_;
 | 
| +    *size = free_size();
 | 
|      read_pending_ = true;
 | 
| +    return true;
 | 
|    }
 | 
|  
 | 
| -  intptr_t GetDataSize() { return data_size_; }
 | 
| +  intptr_t GetDataSize() { return data_size(); }
 | 
|  
 | 
|    uint8_t* GetFirstDataBuffer() {
 | 
| -    ASSERT(head_ != NULL);
 | 
| -    ASSERT(head_ == tail_);
 | 
| -    ASSERT(data_size_ <= kBufferSize);
 | 
| -    return head_->data_;
 | 
| +    ASSERT(head() != NULL);
 | 
| +    ASSERT(head() == tail());
 | 
| +    ASSERT(data_size() <= kBufferSize);
 | 
| +    return head()->data();
 | 
|    }
 | 
|  
 | 
|    void FreeDataBuffer() { Free(); }
 | 
| @@ -776,7 +779,9 @@ class OverlappedHandle {
 | 
|        ClearOverlapped();
 | 
|        uint8_t* buffer;
 | 
|        intptr_t buffer_size;
 | 
| -      buffer_.GetReadBuffer(&buffer, &buffer_size);
 | 
| +      if (!buffer_.GetReadBuffer(&buffer, &buffer_size)) {
 | 
| +        return false;
 | 
| +      }
 | 
|        BOOL ok = ReadFile(handle_, buffer, buffer_size, NULL, &overlapped_);
 | 
|        if (!ok) {
 | 
|          return (GetLastError() == ERROR_IO_PENDING);
 | 
| @@ -793,6 +798,10 @@ class OverlappedHandle {
 | 
|  
 | 
|    void FreeDataBuffer() { return buffer_.FreeDataBuffer(); }
 | 
|  
 | 
| +#if defined(DEBUG)
 | 
| +  bool IsEmpty() const { return buffer_.IsEmpty(); }
 | 
| +#endif
 | 
| +
 | 
|    void Close() {
 | 
|      CloseHandle(handle_);
 | 
|      CloseHandle(event_);
 | 
| @@ -882,6 +891,8 @@ bool Process::Wait(intptr_t pid,
 | 
|    // All handles closed and all data read.
 | 
|    result->set_stdout_data(oh[0].GetData());
 | 
|    result->set_stderr_data(oh[1].GetData());
 | 
| +  DEBUG_ASSERT(oh[0].IsEmpty());
 | 
| +  DEBUG_ASSERT(oh[1].IsEmpty());
 | 
|  
 | 
|    // Calculate the exit code.
 | 
|    ASSERT(oh[2].GetDataSize() == 8);
 | 
| 
 |