Index: net/base/ssl_client_socket_nss.cc |
=================================================================== |
--- net/base/ssl_client_socket_nss.cc (revision 14682) |
+++ net/base/ssl_client_socket_nss.cc (working copy) |
@@ -105,7 +105,6 @@ |
hostname_(hostname), |
ssl_config_(ssl_config), |
user_callback_(NULL), |
- user_buf_(NULL), |
user_buf_len_(0), |
server_cert_error_(0), |
completed_handshake_(false), |
@@ -317,7 +316,7 @@ |
return ret; |
} |
-int SSLClientSocketNSS::Read(char* buf, int buf_len, |
+int SSLClientSocketNSS::Read(IOBuffer* buf, int buf_len, |
CompletionCallback* callback) { |
EnterFunction(buf_len); |
DCHECK(completed_handshake_); |
@@ -336,7 +335,7 @@ |
return rv; |
} |
-int SSLClientSocketNSS::Write(const char* buf, int buf_len, |
+int SSLClientSocketNSS::Write(IOBuffer* buf, int buf_len, |
CompletionCallback* callback) { |
EnterFunction(buf_len); |
DCHECK(completed_handshake_); |
@@ -344,7 +343,7 @@ |
DCHECK(!user_callback_); |
DCHECK(!user_buf_); |
- user_buf_ = const_cast<char*>(buf); |
+ user_buf_ = buf; |
user_buf_len_ = buf_len; |
GotoState(STATE_PAYLOAD_WRITE); |
@@ -405,6 +404,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); |
LeaveFunction(""); |
} |
@@ -428,12 +428,10 @@ |
return PR_UNKNOWN_ERROR; |
} |
-/* |
- * Do network I/O between the given buffer and the given socket. |
- * Return 0 for EOF, |
- * > 0 for bytes transferred immediately, |
- * < 0 for error (or the non-error ERR_IO_PENDING). |
- */ |
+// Do network I/O between the given buffer and the given socket. |
+// Return 0 for EOF, |
+// > 0 for bytes transferred immediately, |
+// < 0 for error (or the non-error ERR_IO_PENDING). |
int SSLClientSocketNSS::BufferSend(void) { |
if (transport_send_busy_) return ERR_IO_PENDING; |
@@ -445,7 +443,9 @@ |
if (!nb) { |
rv = OK; |
} else { |
- rv = transport_->Write(buf, nb, &buffer_send_callback_); |
+ scoped_refptr<IOBuffer> send_buffer = new IOBuffer(nb); |
+ memcpy(send_buffer->data(), buf, nb); |
+ rv = transport_->Write(send_buffer, nb, &buffer_send_callback_); |
if (rv == ERR_IO_PENDING) |
transport_send_busy_ = true; |
else |
@@ -476,11 +476,16 @@ |
// buffer too full to read into, so no I/O possible at moment |
rv = ERR_IO_PENDING; |
} else { |
- rv = transport_->Read(buf, nb, &buffer_recv_callback_); |
- if (rv == ERR_IO_PENDING) |
+ recv_buffer_ = new IOBuffer(nb); |
+ rv = transport_->Read(recv_buffer_, nb, &buffer_recv_callback_); |
+ if (rv == ERR_IO_PENDING) { |
transport_recv_busy_ = true; |
- else |
+ } else { |
+ if (rv > 0) |
+ memcpy(buf, recv_buffer_->data(), rv); |
memio_PutReadResult(nss_bufs_, MapErrorToNSS(rv)); |
+ recv_buffer_ = NULL; |
+ } |
} |
LeaveFunction(rv); |
return rv; |
@@ -488,6 +493,12 @@ |
void SSLClientSocketNSS::BufferRecvComplete(int result) { |
EnterFunction(result); |
+ if (result > 0) { |
+ char *buf; |
+ memio_GetReadParams(nss_bufs_, &buf); |
+ memcpy(buf, recv_buffer_->data(), result); |
+ } |
+ recv_buffer_ = NULL; |
memio_PutReadResult(nss_bufs_, result); |
transport_recv_busy_ = false; |
OnIOComplete(result); |
@@ -607,9 +618,9 @@ |
int SSLClientSocketNSS::DoPayloadRead() { |
EnterFunction(user_buf_len_); |
- int rv = PR_Read(nss_fd_, user_buf_, user_buf_len_); |
+ int rv = PR_Read(nss_fd_, user_buf_->data(), user_buf_len_); |
if (rv >= 0) { |
- LogData(user_buf_, rv); |
+ LogData(user_buf_->data(), rv); |
user_buf_ = NULL; |
LeaveFunction(""); |
return rv; |
@@ -627,9 +638,9 @@ |
int SSLClientSocketNSS::DoPayloadWrite() { |
EnterFunction(user_buf_len_); |
- int rv = PR_Write(nss_fd_, user_buf_, user_buf_len_); |
+ int rv = PR_Write(nss_fd_, user_buf_->data(), user_buf_len_); |
if (rv >= 0) { |
- LogData(user_buf_, rv); |
+ LogData(user_buf_->data(), rv); |
user_buf_ = NULL; |
LeaveFunction(""); |
return rv; |