Index: tools/android/forwarder2/forwarder.cc |
diff --git a/tools/android/forwarder2/forwarder.cc b/tools/android/forwarder2/forwarder.cc |
index 1e0bcd0f53f1aba748b519fdddf0b3364890e98f..8ca25bb2b8e8441b2e34bb3829a9ecd7075d1ed7 100644 |
--- a/tools/android/forwarder2/forwarder.cc |
+++ b/tools/android/forwarder2/forwarder.cc |
@@ -25,10 +25,10 @@ const int kBufferSize = 32 * 1024; |
// |
// These objects are used in a pair to handle duplex traffic, as in: |
// |
-// ------> [BufferedCopier_1] ---> |
-// / \ |
+// -------> [BufferedCopier_1] ---> |
+// | | |
// socket_1 * * socket_2 |
-// \ / |
+// | | |
// <------ [BufferedCopier_2] <---- |
// |
// When a BufferedCopier is in the READING state (see below), it only listens |
@@ -136,7 +136,13 @@ class Forwarder::BufferedCopier { |
// Call this after a select() call to operate over the buffer. |
void ProcessSelect(const fd_set& read_fds, const fd_set& write_fds) { |
- int fd, ret; |
+ int fd; |
+ int ret; |
+ // With FORTIFY_SOURCE, FD_ISSET is implemented as a function that takes a |
+ // non-const fd_set*. Make a copy of the passed arguments so we can safely |
+ // take a reference. |
+ fd_set read_fds_copy = read_fds; |
+ fd_set write_fds_copy = write_fds; |
switch (state_) { |
case STATE_READING: |
fd = socket_from_->fd(); |
@@ -144,7 +150,7 @@ class Forwarder::BufferedCopier { |
state_ = STATE_CLOSED; // T02 |
return; |
} |
- if (!FD_ISSET(fd, &read_fds)) |
+ if (!FD_ISSET(fd, &read_fds_copy)) |
return; |
ret = socket_from_->NonBlockingRead(buffer_, kBufferSize); |
@@ -164,7 +170,7 @@ class Forwarder::BufferedCopier { |
ForceClose(); // T06 + T11 |
return; |
} |
- if (!FD_ISSET(fd, &write_fds)) |
+ if (!FD_ISSET(fd, &write_fds_copy)) |
return; |
ret = socket_to_->NonBlockingWrite(buffer_ + write_offset_, |