| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "net/socket/ssl_client_socket_mac.h" | 5 #include "net/socket/ssl_client_socket_mac.h" |
| 6 | 6 |
| 7 #include <CoreServices/CoreServices.h> | 7 #include <CoreServices/CoreServices.h> |
| 8 #include <netdb.h> | 8 #include <netdb.h> |
| 9 #include <sys/socket.h> | 9 #include <sys/socket.h> |
| 10 #include <sys/types.h> | 10 #include <sys/types.h> |
| (...skipping 1177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1188 // There's a subtle difference here in semantics of the "would block" errors. | 1188 // There's a subtle difference here in semantics of the "would block" errors. |
| 1189 // In our code, ERR_IO_PENDING means the whole operation is async, while | 1189 // In our code, ERR_IO_PENDING means the whole operation is async, while |
| 1190 // errSSLWouldBlock means that the stream isn't ending (and is often returned | 1190 // errSSLWouldBlock means that the stream isn't ending (and is often returned |
| 1191 // along with partial data). So even though "would block" is returned, if we | 1191 // along with partial data). So even though "would block" is returned, if we |
| 1192 // have data, let's just return it. This is further complicated by the fact | 1192 // have data, let's just return it. This is further complicated by the fact |
| 1193 // that errSSLWouldBlock is also used to short-circuit SSLRead()'s | 1193 // that errSSLWouldBlock is also used to short-circuit SSLRead()'s |
| 1194 // transparent renegotiation, so that we can update our state machine above, | 1194 // transparent renegotiation, so that we can update our state machine above, |
| 1195 // which otherwise would get out of sync with the SSLContextRef's internal | 1195 // which otherwise would get out of sync with the SSLContextRef's internal |
| 1196 // state machine. | 1196 // state machine. |
| 1197 if (processed > 0) { | 1197 if (processed > 0) { |
| 1198 LogByteTransfer(net_log_, NetLog::TYPE_SSL_SOCKET_BYTES_RECEIVED, | 1198 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_RECEIVED, |
| 1199 processed, user_read_buf_->data()); | 1199 processed, user_read_buf_->data()); |
| 1200 return processed; | 1200 return processed; |
| 1201 } | 1201 } |
| 1202 | 1202 |
| 1203 switch (status) { | 1203 switch (status) { |
| 1204 case errSSLClosedNoNotify: | 1204 case errSSLClosedNoNotify: |
| 1205 // TODO(wtc): Unless we have received the close_notify alert, we need to | 1205 // TODO(wtc): Unless we have received the close_notify alert, we need to |
| 1206 // return an error code indicating that the SSL connection ended | 1206 // return an error code indicating that the SSL connection ended |
| 1207 // uncleanly, a potential truncation attack. See http://crbug.com/18586. | 1207 // uncleanly, a potential truncation attack. See http://crbug.com/18586. |
| 1208 return OK; | 1208 return OK; |
| 1209 | 1209 |
| 1210 default: | 1210 default: |
| 1211 return NetErrorFromOSStatus(status); | 1211 return NetErrorFromOSStatus(status); |
| 1212 } | 1212 } |
| 1213 } | 1213 } |
| 1214 | 1214 |
| 1215 int SSLClientSocketMac::DoPayloadWrite() { | 1215 int SSLClientSocketMac::DoPayloadWrite() { |
| 1216 // Too much data in flight? | 1216 // Too much data in flight? |
| 1217 if (send_buffer_.size() > kWriteSizePauseLimit) | 1217 if (send_buffer_.size() > kWriteSizePauseLimit) |
| 1218 return ERR_IO_PENDING; | 1218 return ERR_IO_PENDING; |
| 1219 | 1219 |
| 1220 size_t processed = 0; | 1220 size_t processed = 0; |
| 1221 OSStatus status = SSLWrite(ssl_context_, | 1221 OSStatus status = SSLWrite(ssl_context_, |
| 1222 user_write_buf_->data(), | 1222 user_write_buf_->data(), |
| 1223 user_write_buf_len_, | 1223 user_write_buf_len_, |
| 1224 &processed); | 1224 &processed); |
| 1225 | 1225 |
| 1226 if (processed > 0) { | 1226 if (processed > 0) { |
| 1227 LogByteTransfer(net_log_, NetLog::TYPE_SSL_SOCKET_BYTES_SENT, processed, | 1227 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_SENT, processed, |
| 1228 user_write_buf_->data()); | 1228 user_write_buf_->data()); |
| 1229 return processed; | 1229 return processed; |
| 1230 } | 1230 } |
| 1231 | 1231 |
| 1232 return NetErrorFromOSStatus(status); | 1232 return NetErrorFromOSStatus(status); |
| 1233 } | 1233 } |
| 1234 | 1234 |
| 1235 int SSLClientSocketMac::DoCompletedRenegotiation(int result) { | 1235 int SSLClientSocketMac::DoCompletedRenegotiation(int result) { |
| 1236 // The user had a read in progress, which was interrupted by the | 1236 // The user had a read in progress, which was interrupted by the |
| 1237 // renegotiation. Return the application data that was processed after the | 1237 // renegotiation. Return the application data that was processed after the |
| 1238 // handshake completed. | 1238 // handshake completed. |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1393 if (rv < 0 && rv != ERR_IO_PENDING) { | 1393 if (rv < 0 && rv != ERR_IO_PENDING) { |
| 1394 us->write_io_buf_ = NULL; | 1394 us->write_io_buf_ = NULL; |
| 1395 return OSStatusFromNetError(rv); | 1395 return OSStatusFromNetError(rv); |
| 1396 } | 1396 } |
| 1397 | 1397 |
| 1398 // always lie to our caller | 1398 // always lie to our caller |
| 1399 return noErr; | 1399 return noErr; |
| 1400 } | 1400 } |
| 1401 | 1401 |
| 1402 } // namespace net | 1402 } // namespace net |
| OLD | NEW |