Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(36)

Side by Side Diff: net/socket/ssl_client_socket_nss.cc

Issue 7399025: Fix instability in SSL client/server sockets (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix similar issue in OnSendComplete() Created 9 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | net/socket/ssl_server_socket_nss.cc » ('j') | net/socket/ssl_server_socket_nss.cc » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 // This file includes code SSLClientSocketNSS::DoVerifyCertComplete() derived 5 // This file includes code SSLClientSocketNSS::DoVerifyCertComplete() derived
6 // from AuthCertificateCallback() in 6 // from AuthCertificateCallback() in
7 // mozilla/security/manager/ssl/src/nsNSSCallbacks.cpp. 7 // mozilla/security/manager/ssl/src/nsNSSCallbacks.cpp.
8 8
9 /* ***** BEGIN LICENSE BLOCK ***** 9 /* ***** BEGIN LICENSE BLOCK *****
10 * Version: MPL 1.1/GPL 2.0/LGPL 2.1 10 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
(...skipping 1170 matching lines...) Expand 10 before | Expand all | Expand 10 after
1181 LeaveFunction(""); 1181 LeaveFunction("");
1182 return; 1182 return;
1183 } 1183 }
1184 1184
1185 // OnSendComplete may need to call DoPayloadRead while the renegotiation 1185 // OnSendComplete may need to call DoPayloadRead while the renegotiation
1186 // handshake is in progress. 1186 // handshake is in progress.
1187 int rv_read = ERR_IO_PENDING; 1187 int rv_read = ERR_IO_PENDING;
1188 int rv_write = ERR_IO_PENDING; 1188 int rv_write = ERR_IO_PENDING;
1189 bool network_moved; 1189 bool network_moved;
1190 do { 1190 do {
1191 if (user_read_buf_) 1191 if (user_read_buf_ && rv_read == ERR_IO_PENDING)
1192 rv_read = DoPayloadRead(); 1192 rv_read = DoPayloadRead();
1193 if (user_write_buf_) 1193 if (user_write_buf_ && rv_write == ERR_IO_PENDING)
1194 rv_write = DoPayloadWrite(); 1194 rv_write = DoPayloadWrite();
1195 network_moved = DoTransportIO(); 1195 network_moved = DoTransportIO();
1196 } while (rv_read == ERR_IO_PENDING && 1196 } while (network_moved);
Wez 2011/07/18 21:53:33 This loop used to exit on error, or if one or othe
Sergey Ulanov 2011/07/19 19:26:56 Actually the code below may crash even when only D
wtc 2011/07/21 00:42:30 Wez, you are right on. I recently noticed this pr
1197 rv_write == ERR_IO_PENDING &&
1198 network_moved);
1199 1197
1200 if (user_read_buf_ && rv_read != ERR_IO_PENDING) 1198 if (user_read_buf_ && rv_read != ERR_IO_PENDING)
1201 DoReadCallback(rv_read); 1199 DoReadCallback(rv_read);
1202 if (user_write_buf_ && rv_write != ERR_IO_PENDING) 1200 if (user_write_buf_ && rv_write != ERR_IO_PENDING)
1203 DoWriteCallback(rv_write); 1201 DoWriteCallback(rv_write);
1204 1202
1205 LeaveFunction(""); 1203 LeaveFunction("");
1206 } 1204 }
1207 1205
1208 void SSLClientSocketNSS::OnRecvComplete(int result) { 1206 void SSLClientSocketNSS::OnRecvComplete(int result) {
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
1310 1308
1311 if (!nss_bufs_) { 1309 if (!nss_bufs_) {
1312 LOG(DFATAL) << "!nss_bufs_"; 1310 LOG(DFATAL) << "!nss_bufs_";
1313 int rv = ERR_UNEXPECTED; 1311 int rv = ERR_UNEXPECTED;
1314 net_log_.AddEvent(NetLog::TYPE_SSL_WRITE_ERROR, 1312 net_log_.AddEvent(NetLog::TYPE_SSL_WRITE_ERROR,
1315 make_scoped_refptr(new SSLErrorParams(rv, 0))); 1313 make_scoped_refptr(new SSLErrorParams(rv, 0)));
1316 return rv; 1314 return rv;
1317 } 1315 }
1318 1316
1319 bool network_moved; 1317 bool network_moved;
1320 int rv; 1318 int rv = ERR_IO_PENDING;
1321 do { 1319 do {
1322 rv = DoPayloadWrite(); 1320 if (rv == ERR_IO_PENDING)
1321 rv = DoPayloadWrite();
1323 network_moved = DoTransportIO(); 1322 network_moved = DoTransportIO();
1324 } while (rv == ERR_IO_PENDING && network_moved); 1323 } while (network_moved);
Wez 2011/07/18 21:53:33 This will continue to loop on PR_Write() errors.
Sergey Ulanov 2011/07/19 19:26:56 Why can't we continue pushing data to the transpor
1325 1324
1326 LeaveFunction(""); 1325 LeaveFunction("");
1327 return rv; 1326 return rv;
1328 } 1327 }
1329 1328
1330 bool SSLClientSocketNSS::LoadSSLHostInfo() { 1329 bool SSLClientSocketNSS::LoadSSLHostInfo() {
1331 const SSLHostInfo::State& state(ssl_host_info_->state()); 1330 const SSLHostInfo::State& state(ssl_host_info_->state());
1332 1331
1333 if (state.certs.empty()) 1332 if (state.certs.empty())
1334 return false; 1333 return false;
(...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after
1735 } 1734 }
1736 1735
1737 // Do network I/O between the given buffer and the given socket. 1736 // Do network I/O between the given buffer and the given socket.
1738 // Return true if some I/O performed, false otherwise (error or ERR_IO_PENDING) 1737 // Return true if some I/O performed, false otherwise (error or ERR_IO_PENDING)
1739 bool SSLClientSocketNSS::DoTransportIO() { 1738 bool SSLClientSocketNSS::DoTransportIO() {
1740 EnterFunction(""); 1739 EnterFunction("");
1741 bool network_moved = false; 1740 bool network_moved = false;
1742 if (nss_bufs_ != NULL) { 1741 if (nss_bufs_ != NULL) {
1743 int nsent = BufferSend(); 1742 int nsent = BufferSend();
1744 int nreceived = BufferRecv(); 1743 int nreceived = BufferRecv();
1745 network_moved = (nsent > 0 || nreceived >= 0); 1744 network_moved = (nsent > 0 || nreceived > 0);
Wez 2011/07/18 21:53:33 A zero return value from the underlying net::Socke
Sergey Ulanov 2011/07/19 19:26:56 The previous behavior may be counter-intuitive dep
1746 } 1745 }
1747 LeaveFunction(network_moved); 1746 LeaveFunction(network_moved);
1748 return network_moved; 1747 return network_moved;
1749 } 1748 }
1750 1749
1751 // Return 0 for EOF, 1750 // Return 0 for EOF,
1752 // > 0 for bytes transferred immediately, 1751 // > 0 for bytes transferred immediately,
1753 // < 0 for error (or the non-error ERR_IO_PENDING). 1752 // < 0 for error (or the non-error ERR_IO_PENDING).
1754 int SSLClientSocketNSS::BufferSend(void) { 1753 int SSLClientSocketNSS::BufferSend(void) {
1755 if (transport_send_busy_) 1754 if (transport_send_busy_)
(...skipping 513 matching lines...) Expand 10 before | Expand all | Expand 10 after
2269 valid_thread_id_ = base::PlatformThread::CurrentId(); 2268 valid_thread_id_ = base::PlatformThread::CurrentId();
2270 } 2269 }
2271 2270
2272 bool SSLClientSocketNSS::CalledOnValidThread() const { 2271 bool SSLClientSocketNSS::CalledOnValidThread() const {
2273 EnsureThreadIdAssigned(); 2272 EnsureThreadIdAssigned();
2274 base::AutoLock auto_lock(lock_); 2273 base::AutoLock auto_lock(lock_);
2275 return valid_thread_id_ == base::PlatformThread::CurrentId(); 2274 return valid_thread_id_ == base::PlatformThread::CurrentId();
2276 } 2275 }
2277 2276
2278 } // namespace net 2277 } // namespace net
OLDNEW
« no previous file with comments | « no previous file | net/socket/ssl_server_socket_nss.cc » ('j') | net/socket/ssl_server_socket_nss.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698