summaryrefslogtreecommitdiffstats
path: root/net/base/ssl_client_socket_nss.cc
diff options
context:
space:
mode:
Diffstat (limited to 'net/base/ssl_client_socket_nss.cc')
-rw-r--r--net/base/ssl_client_socket_nss.cc47
1 files changed, 29 insertions, 18 deletions
diff --git a/net/base/ssl_client_socket_nss.cc b/net/base/ssl_client_socket_nss.cc
index 78cd3c0..7318b25 100644
--- a/net/base/ssl_client_socket_nss.cc
+++ b/net/base/ssl_client_socket_nss.cc
@@ -105,7 +105,6 @@ SSLClientSocketNSS::SSLClientSocketNSS(ClientSocket* transport_socket,
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 @@ bool SSLClientSocketNSS::IsConnectedAndIdle() const {
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 @@ int SSLClientSocketNSS::Read(char* buf, int buf_len,
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 @@ int SSLClientSocketNSS::Write(const char* buf, int buf_len,
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 @@ void SSLClientSocketNSS::DoCallback(int rv) {
// 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 @@ static PRErrorCode MapErrorToNSS(int result) {
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 @@ int SSLClientSocketNSS::BufferSend(void) {
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 @@ int SSLClientSocketNSS::BufferRecv(void) {
// 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 @@ int SSLClientSocketNSS::BufferRecv(void) {
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::DoHandshakeRead() {
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::DoPayloadRead() {
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;