You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by am...@apache.org on 2013/08/06 22:09:27 UTC

git commit: TS-2051: Fix SSL crash due to excess READ_COMPLETE events.

Updated Branches:
  refs/heads/master c1c963efa -> 84486681b


TS-2051: Fix SSL crash due to excess READ_COMPLETE events.


Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo
Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/84486681
Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/84486681
Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/84486681

Branch: refs/heads/master
Commit: 84486681b865f9d3e5e8c79ffadc8f88834a33b2
Parents: c1c963e
Author: Alan M. Carroll <am...@network-geographics.com>
Authored: Tue Aug 6 15:09:05 2013 -0500
Committer: Alan M. Carroll <am...@network-geographics.com>
Committed: Tue Aug 6 15:09:05 2013 -0500

----------------------------------------------------------------------
 CHANGES                         |  2 ++
 iocore/net/SSLNetVConnection.cc | 18 +++++++++++-------
 2 files changed, 13 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/trafficserver/blob/84486681/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index c358bb5..aed5f49 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,6 +1,8 @@
                                                          -*- coding: utf-8 -*-
 Changes with Apache Traffic Server 3.3.5
 
+  *) [TS-2051] Fix SSL crash due to excess READ_COMPLETE events.
+
   *) [TS-2102] SPDY plugin tries to setup protocol handler too early.
 
   *) [TS-1953] remove version checks from plugins that don't use it and

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/84486681/iocore/net/SSLNetVConnection.cc
----------------------------------------------------------------------
diff --git a/iocore/net/SSLNetVConnection.cc b/iocore/net/SSLNetVConnection.cc
index 3f429eb..86e788e 100644
--- a/iocore/net/SSLNetVConnection.cc
+++ b/iocore/net/SSLNetVConnection.cc
@@ -189,6 +189,7 @@ SSLNetVConnection::net_read_io(NetHandler *nh, EThread *lthread)
   int64_t bytes = 0;
   NetState *s = &this->read;
   MIOBufferAccessor &buf = s->vio.buffer;
+  int64_t ntodo = s->vio.ntodo();
 
   MUTEX_TRY_LOCK_FOR(lock, s->vio.mutex, lthread, s->vio._cont);
   if (!lock) {
@@ -228,21 +229,24 @@ SSLNetVConnection::net_read_io(NetHandler *nh, EThread *lthread)
       nh->write_ready_list.remove(this);
       writeReschedule(nh);
     } else if (ret == EVENT_DONE) {
-      read.triggered = 1;
-      if (read.enabled)
-        nh->read_ready_list.in_or_enqueue(this);
+      // If this was driven by a zero length read, signal complete when
+      // the handshake is complete. Otherwise set up for continuing read
+      // operations.
+      if (ntodo <= 0) {
+        readSignalDone(VC_EVENT_READ_COMPLETE, nh);
+      } else {
+        read.triggered = 1;
+        if (read.enabled)
+          nh->read_ready_list.in_or_enqueue(this);
+      }
     } else
       readReschedule(nh);
     return;
   }
 
   // If there is nothing to do, disable connection
-  int64_t ntodo = s->vio.ntodo();
   if (ntodo <= 0) {
     read_disable(nh, this);
-    // Don't return early even if there's nothing. We still need
-    // to propagate events for zero-length reads.
-    readSignalDone(VC_EVENT_READ_COMPLETE, nh);
     return;
   }