OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "tools/android/forwarder2/forwarder.h" | 5 #include "tools/android/forwarder2/forwarder.h" |
6 | 6 |
7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "base/posix/eintr_wrapper.h" | 9 #include "base/posix/eintr_wrapper.h" |
10 #include "tools/android/forwarder2/socket.h" | 10 #include "tools/android/forwarder2/socket.h" |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
129 break; | 129 break; |
130 | 130 |
131 case STATE_CLOSED: | 131 case STATE_CLOSED: |
132 return; | 132 return; |
133 } | 133 } |
134 *max_fd = std::max(*max_fd, fd); | 134 *max_fd = std::max(*max_fd, fd); |
135 } | 135 } |
136 | 136 |
137 // Call this after a select() call to operate over the buffer. | 137 // Call this after a select() call to operate over the buffer. |
138 void ProcessSelect(const fd_set& read_fds, const fd_set& write_fds) { | 138 void ProcessSelect(const fd_set& read_fds, const fd_set& write_fds) { |
139 int fd, ret; | 139 int fd; |
| 140 int ret; |
| 141 // With FORTIFY_SOURCE, FD_ISSET is implemented as a function that takes a |
| 142 // non-const fd_set*. Make a copy of the passed arguments so we can safely |
| 143 // take a reference. |
| 144 fd_set read_fds_copy = read_fds; |
| 145 fd_set write_fds_copy = write_fds; |
140 switch (state_) { | 146 switch (state_) { |
141 case STATE_READING: | 147 case STATE_READING: |
142 fd = socket_from_->fd(); | 148 fd = socket_from_->fd(); |
143 if (fd < 0) { | 149 if (fd < 0) { |
144 state_ = STATE_CLOSED; // T02 | 150 state_ = STATE_CLOSED; // T02 |
145 return; | 151 return; |
146 } | 152 } |
147 if (!FD_ISSET(fd, &read_fds)) | 153 if (!FD_ISSET(fd, &read_fds_copy)) |
148 return; | 154 return; |
149 | 155 |
150 ret = socket_from_->NonBlockingRead(buffer_, kBufferSize); | 156 ret = socket_from_->NonBlockingRead(buffer_, kBufferSize); |
151 if (ret <= 0) { | 157 if (ret <= 0) { |
152 ForceClose(); // T02 | 158 ForceClose(); // T02 |
153 return; | 159 return; |
154 } | 160 } |
155 bytes_read_ = ret; | 161 bytes_read_ = ret; |
156 write_offset_ = 0; | 162 write_offset_ = 0; |
157 state_ = STATE_WRITING; // T01 | 163 state_ = STATE_WRITING; // T01 |
158 break; | 164 break; |
159 | 165 |
160 case STATE_WRITING: | 166 case STATE_WRITING: |
161 case STATE_CLOSING: | 167 case STATE_CLOSING: |
162 fd = socket_to_->fd(); | 168 fd = socket_to_->fd(); |
163 if (fd < 0) { | 169 if (fd < 0) { |
164 ForceClose(); // T06 + T11 | 170 ForceClose(); // T06 + T11 |
165 return; | 171 return; |
166 } | 172 } |
167 if (!FD_ISSET(fd, &write_fds)) | 173 if (!FD_ISSET(fd, &write_fds_copy)) |
168 return; | 174 return; |
169 | 175 |
170 ret = socket_to_->NonBlockingWrite(buffer_ + write_offset_, | 176 ret = socket_to_->NonBlockingWrite(buffer_ + write_offset_, |
171 bytes_read_ - write_offset_); | 177 bytes_read_ - write_offset_); |
172 if (ret <= 0) { | 178 if (ret <= 0) { |
173 ForceClose(); // T06 + T11 | 179 ForceClose(); // T06 + T11 |
174 return; | 180 return; |
175 } | 181 } |
176 | 182 |
177 write_offset_ += ret; | 183 write_offset_ += ret; |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
246 return buffer1_->is_closed() && buffer2_->is_closed(); | 252 return buffer1_->is_closed() && buffer2_->is_closed(); |
247 } | 253 } |
248 | 254 |
249 void Forwarder::Shutdown() { | 255 void Forwarder::Shutdown() { |
250 DCHECK(thread_checker_.CalledOnValidThread()); | 256 DCHECK(thread_checker_.CalledOnValidThread()); |
251 buffer1_->Close(); | 257 buffer1_->Close(); |
252 buffer2_->Close(); | 258 buffer2_->Close(); |
253 } | 259 } |
254 | 260 |
255 } // namespace forwarder2 | 261 } // namespace forwarder2 |
OLD | NEW |