summaryrefslogtreecommitdiffstats
path: root/net/socket/ssl_client_socket_nss.cc
diff options
context:
space:
mode:
authorwtc@chromium.org <wtc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-12-10 23:06:44 +0000
committerwtc@chromium.org <wtc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-12-10 23:06:44 +0000
commit914286d672587afca4d0485ea2cb8c7b33c8b84d (patch)
tree08c1d57a61e979d86e017057bcc434037132ddeb /net/socket/ssl_client_socket_nss.cc
parentdc60e95adac80ad6c9a88cde612d37d5ecba3ebd (diff)
downloadchromium_src-914286d672587afca4d0485ea2cb8c7b33c8b84d.zip
chromium_src-914286d672587afca4d0485ea2cb8c7b33c8b84d.tar.gz
chromium_src-914286d672587afca4d0485ea2cb8c7b33c8b84d.tar.bz2
BufferSend needs to call memio_GetWriteParams() and transport_->Write()
twice because the circular memio buffer may have two contiguous parts of data. In the SSLClientSocket unit tests, we should compare the result of sock->Write() with the expected value whether it completes synchronously or asynchronously. R=dank BUG=29815 TEST=a new unit test that issue a hanging Read and then issue a Write. Review URL: http://codereview.chromium.org/464082 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@34300 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/socket/ssl_client_socket_nss.cc')
-rw-r--r--net/socket/ssl_client_socket_nss.cc34
1 files changed, 22 insertions, 12 deletions
diff --git a/net/socket/ssl_client_socket_nss.cc b/net/socket/ssl_client_socket_nss.cc
index 4968823..5c95ee0 100644
--- a/net/socket/ssl_client_socket_nss.cc
+++ b/net/socket/ssl_client_socket_nss.cc
@@ -747,25 +747,35 @@ bool SSLClientSocketNSS::DoTransportIO() {
int SSLClientSocketNSS::BufferSend(void) {
if (transport_send_busy_) return ERR_IO_PENDING;
- const char *buf;
- int nb = memio_GetWriteParams(nss_bufs_, &buf);
- EnterFunction(nb);
+ int nsent = 0;
+ EnterFunction("");
+ // nss_bufs_ is a circular buffer. It may have two contiguous parts
+ // (before and after the wrap). So this for loop needs two iterations.
+ for (int i = 0; i < 2; ++i) {
+ const char* buf;
+ int nb = memio_GetWriteParams(nss_bufs_, &buf);
+ if (!nb)
+ break;
- int rv;
- if (!nb) {
- rv = OK;
- } else {
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)
+ int rv = transport_->Write(send_buffer, nb, &buffer_send_callback_);
+ if (rv == ERR_IO_PENDING) {
transport_send_busy_ = true;
- else
+ break;
+ } else {
memio_PutWriteResult(nss_bufs_, MapErrorToNSS(rv));
+ if (rv < 0) {
+ // Return the error even if the previous Write succeeded.
+ nsent = rv;
+ break;
+ }
+ nsent += rv;
+ }
}
- LeaveFunction(rv);
- return rv;
+ LeaveFunction(nsent);
+ return nsent;
}
void SSLClientSocketNSS::BufferSendComplete(int result) {