| Index: net/base/ssl_client_socket_mac.cc
|
| ===================================================================
|
| --- net/base/ssl_client_socket_mac.cc (revision 14682)
|
| +++ net/base/ssl_client_socket_mac.cc (working copy)
|
| @@ -349,35 +349,43 @@
|
| return completed_handshake_ && transport_->IsConnectedAndIdle();
|
| }
|
|
|
| -int SSLClientSocketMac::Read(char* buf, int buf_len,
|
| +int SSLClientSocketMac::Read(IOBuffer* buf, int buf_len,
|
| CompletionCallback* callback) {
|
| DCHECK(completed_handshake_);
|
| DCHECK(next_state_ == STATE_NONE);
|
| DCHECK(!user_callback_);
|
| + DCHECK(!user_buf_);
|
|
|
| user_buf_ = buf;
|
| user_buf_len_ = buf_len;
|
|
|
| next_state_ = STATE_PAYLOAD_READ;
|
| int rv = DoLoop(OK);
|
| - if (rv == ERR_IO_PENDING)
|
| + if (rv == ERR_IO_PENDING) {
|
| user_callback_ = callback;
|
| + } else {
|
| + user_buf_ = NULL;
|
| + }
|
| return rv;
|
| }
|
|
|
| -int SSLClientSocketMac::Write(const char* buf, int buf_len,
|
| +int SSLClientSocketMac::Write(IOBuffer* buf, int buf_len,
|
| CompletionCallback* callback) {
|
| DCHECK(completed_handshake_);
|
| DCHECK(next_state_ == STATE_NONE);
|
| DCHECK(!user_callback_);
|
| + DCHECK(!user_buf_);
|
|
|
| - user_buf_ = const_cast<char*>(buf);
|
| + user_buf_ = buf;
|
| user_buf_len_ = buf_len;
|
|
|
| next_state_ = STATE_PAYLOAD_WRITE;
|
| int rv = DoLoop(OK);
|
| - if (rv == ERR_IO_PENDING)
|
| + if (rv == ERR_IO_PENDING) {
|
| user_callback_ = callback;
|
| + } else {
|
| + user_buf_ = NULL;
|
| + }
|
| return rv;
|
| }
|
|
|
| @@ -419,6 +427,7 @@
|
| // since Run may result in Read being called, clear user_callback_ up front.
|
| CompletionCallback* c = user_callback_;
|
| user_callback_ = NULL;
|
| + user_buf_ = NULL;
|
| c->Run(rv);
|
| }
|
|
|
| @@ -498,9 +507,15 @@
|
| }
|
|
|
| int SSLClientSocketMac::DoReadComplete(int result) {
|
| - if (result < 0)
|
| + if (result < 0) {
|
| + read_io_buf_ = NULL;
|
| return result;
|
| + }
|
|
|
| + char* buffer = &recv_buffer_[recv_buffer_.size() - recv_buffer_tail_slop_];
|
| + memcpy(buffer, read_io_buf_->data(), result);
|
| + read_io_buf_ = NULL;
|
| +
|
| recv_buffer_tail_slop_ -= result;
|
|
|
| return result;
|
| @@ -522,7 +537,7 @@
|
| int SSLClientSocketMac::DoPayloadRead() {
|
| size_t processed;
|
| OSStatus status = SSLRead(ssl_context_,
|
| - user_buf_,
|
| + user_buf_->data(),
|
| user_buf_len_,
|
| &processed);
|
|
|
| @@ -547,7 +562,7 @@
|
| int SSLClientSocketMac::DoPayloadWrite() {
|
| size_t processed;
|
| OSStatus status = SSLWrite(ssl_context_,
|
| - user_buf_,
|
| + user_buf_->data(),
|
| user_buf_len_,
|
| &processed);
|
|
|
| @@ -660,12 +675,15 @@
|
|
|
| int rv = 1; // any old value to spin the loop below
|
| while (rv > 0 && total_read < *data_length) {
|
| - rv = us->transport_->Read(&us->recv_buffer_[us->recv_buffer_head_slop_ +
|
| - total_read],
|
| - us->recv_buffer_tail_slop_,
|
| + char* buffer = &us->recv_buffer_[us->recv_buffer_head_slop_ + total_read];
|
| + us->read_io_buf_ = new IOBuffer(*data_length - total_read);
|
| + rv = us->transport_->Read(us->read_io_buf_,
|
| + *data_length - total_read,
|
| &us->io_callback_);
|
|
|
| - if (rv > 0) {
|
| + if (rv >= 0) {
|
| + memcpy(buffer, us->read_io_buf_->data(), rv);
|
| + us->read_io_buf_ = NULL;
|
| total_read += rv;
|
| us->recv_buffer_tail_slop_ -= rv;
|
| }
|
| @@ -689,6 +707,8 @@
|
|
|
| if (rv == ERR_IO_PENDING) {
|
| us->next_io_state_ = STATE_READ_COMPLETE;
|
| + } else {
|
| + us->read_io_buf_ = NULL;
|
| }
|
|
|
| if (rv < 0)
|
| @@ -717,7 +737,9 @@
|
| static_cast<const char*>(data) + *data_length);
|
| int rv;
|
| do {
|
| - rv = us->transport_->Write(&us->send_buffer_[0],
|
| + scoped_refptr<IOBuffer> buffer = new IOBuffer(us->send_buffer_.size());
|
| + memcpy(buffer->data(), &us->send_buffer_[0], us->send_buffer_.size());
|
| + rv = us->transport_->Write(buffer,
|
| us->send_buffer_.size(),
|
| &us->write_callback_);
|
| if (rv > 0) {
|
|
|