patches/firefox3-27-522684-ssl-tunnel-hang.diff
author yippi
Mon, 27 Sep 2010 21:07:51 +0000
changeset 20108 51df67ca9307
parent 17797 9285bc99cf75
permissions -rw-r--r--
I had these modules listed as being owned by me, but they are really owned by wangke, correcting.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
17633
0a0292dce587 2010-03-04 Ginn Chen <[email protected]>
ginnchen
parents:
diff changeset
     1
diff --git a/testing/mochitest/ssltunnel/ssltunnel.cpp b/testing/mochitest/ssltunnel/ssltunnel.cpp
0a0292dce587 2010-03-04 Ginn Chen <[email protected]>
ginnchen
parents:
diff changeset
     2
--- a/testing/mochitest/ssltunnel/ssltunnel.cpp
0a0292dce587 2010-03-04 Ginn Chen <[email protected]>
ginnchen
parents:
diff changeset
     3
+++ b/testing/mochitest/ssltunnel/ssltunnel.cpp
17797
9285bc99cf75 2010-04-06 Ginn Chen <[email protected]>
ginnchen
parents: 17633
diff changeset
     4
@@ -421,6 +421,7 @@
17633
0a0292dce587 2010-03-04 Ginn Chen <[email protected]>
ginnchen
parents:
diff changeset
     5
       {ci->client_sock, PR_POLL_READ, 0},
0a0292dce587 2010-03-04 Ginn Chen <[email protected]>
ginnchen
parents:
diff changeset
     6
       {other_sock, PR_POLL_READ, 0}
0a0292dce587 2010-03-04 Ginn Chen <[email protected]>
ginnchen
parents:
diff changeset
     7
     };
0a0292dce587 2010-03-04 Ginn Chen <[email protected]>
ginnchen
parents:
diff changeset
     8
+    PRBool socketErrorState[2] = {PR_FALSE, PR_FALSE};
0a0292dce587 2010-03-04 Ginn Chen <[email protected]>
ginnchen
parents:
diff changeset
     9
 
0a0292dce587 2010-03-04 Ginn Chen <[email protected]>
ginnchen
parents:
diff changeset
    10
     while (!((client_error||client_done) && buffers[0].empty() && buffers[1].empty()))
0a0292dce587 2010-03-04 Ginn Chen <[email protected]>
ginnchen
parents:
diff changeset
    11
     {
17797
9285bc99cf75 2010-04-06 Ginn Chen <[email protected]>
ginnchen
parents: 17633
diff changeset
    12
@@ -448,6 +449,7 @@
17633
0a0292dce587 2010-03-04 Ginn Chen <[email protected]>
ginnchen
parents:
diff changeset
    13
         if (out_flags & (PR_POLL_EXCEPT | PR_POLL_ERR | PR_POLL_HUP))
0a0292dce587 2010-03-04 Ginn Chen <[email protected]>
ginnchen
parents:
diff changeset
    14
         {
0a0292dce587 2010-03-04 Ginn Chen <[email protected]>
ginnchen
parents:
diff changeset
    15
           client_error = true;
0a0292dce587 2010-03-04 Ginn Chen <[email protected]>
ginnchen
parents:
diff changeset
    16
+          socketErrorState[s] = PR_TRUE;
0a0292dce587 2010-03-04 Ginn Chen <[email protected]>
ginnchen
parents:
diff changeset
    17
           // We got a fatal error state on the socket. Clear the output buffer
0a0292dce587 2010-03-04 Ginn Chen <[email protected]>
ginnchen
parents:
diff changeset
    18
           // for this socket to break the main loop, we will never more be able
0a0292dce587 2010-03-04 Ginn Chen <[email protected]>
ginnchen
parents:
diff changeset
    19
           // to send those data anyway.
17797
9285bc99cf75 2010-04-06 Ginn Chen <[email protected]>
ginnchen
parents: 17633
diff changeset
    20
@@ -468,10 +470,22 @@
17633
0a0292dce587 2010-03-04 Ginn Chen <[email protected]>
ginnchen
parents:
diff changeset
    21
           else if (bytesRead < 0)
0a0292dce587 2010-03-04 Ginn Chen <[email protected]>
ginnchen
parents:
diff changeset
    22
           {
0a0292dce587 2010-03-04 Ginn Chen <[email protected]>
ginnchen
parents:
diff changeset
    23
             if (PR_GetError() != PR_WOULD_BLOCK_ERROR)
17797
9285bc99cf75 2010-04-06 Ginn Chen <[email protected]>
ginnchen
parents: 17633
diff changeset
    24
-              client_error = true;
17633
0a0292dce587 2010-03-04 Ginn Chen <[email protected]>
ginnchen
parents:
diff changeset
    25
+            {
17797
9285bc99cf75 2010-04-06 Ginn Chen <[email protected]>
ginnchen
parents: 17633
diff changeset
    26
+               // We are in error state, indicate that the connection was 
9285bc99cf75 2010-04-06 Ginn Chen <[email protected]>
ginnchen
parents: 17633
diff changeset
    27
+               // not closed gracefully
9285bc99cf75 2010-04-06 Ginn Chen <[email protected]>
ginnchen
parents: 17633
diff changeset
    28
+               client_error = true;
9285bc99cf75 2010-04-06 Ginn Chen <[email protected]>
ginnchen
parents: 17633
diff changeset
    29
+               socketErrorState[s] = PR_TRUE;
9285bc99cf75 2010-04-06 Ginn Chen <[email protected]>
ginnchen
parents: 17633
diff changeset
    30
+               // Wipe out our send buffer, we cannot send it anyway.
9285bc99cf75 2010-04-06 Ginn Chen <[email protected]>
ginnchen
parents: 17633
diff changeset
    31
+               buffers[s2].bufferhead = buffers[s2].buffertail = buffers[s2].buffer;
17633
0a0292dce587 2010-03-04 Ginn Chen <[email protected]>
ginnchen
parents:
diff changeset
    32
+            }
0a0292dce587 2010-03-04 Ginn Chen <[email protected]>
ginnchen
parents:
diff changeset
    33
           }
0a0292dce587 2010-03-04 Ginn Chen <[email protected]>
ginnchen
parents:
diff changeset
    34
           else
0a0292dce587 2010-03-04 Ginn Chen <[email protected]>
ginnchen
parents:
diff changeset
    35
           {
0a0292dce587 2010-03-04 Ginn Chen <[email protected]>
ginnchen
parents:
diff changeset
    36
+            // If the other socket is in error state (unable to send/receive)
0a0292dce587 2010-03-04 Ginn Chen <[email protected]>
ginnchen
parents:
diff changeset
    37
+            // throw this data away and continue loop
0a0292dce587 2010-03-04 Ginn Chen <[email protected]>
ginnchen
parents:
diff changeset
    38
+            if (socketErrorState[s2])
0a0292dce587 2010-03-04 Ginn Chen <[email protected]>
ginnchen
parents:
diff changeset
    39
+              continue;
0a0292dce587 2010-03-04 Ginn Chen <[email protected]>
ginnchen
parents:
diff changeset
    40
+
0a0292dce587 2010-03-04 Ginn Chen <[email protected]>
ginnchen
parents:
diff changeset
    41
             buffers[s].buffertail += bytesRead;
0a0292dce587 2010-03-04 Ginn Chen <[email protected]>
ginnchen
parents:
diff changeset
    42
 
0a0292dce587 2010-03-04 Ginn Chen <[email protected]>
ginnchen
parents:
diff changeset
    43
             // We have to accept and handle the initial CONNECT request here
17797
9285bc99cf75 2010-04-06 Ginn Chen <[email protected]>
ginnchen
parents: 17633
diff changeset
    44
@@ -528,6 +542,7 @@
17633
0a0292dce587 2010-03-04 Ginn Chen <[email protected]>
ginnchen
parents:
diff changeset
    45
           {
0a0292dce587 2010-03-04 Ginn Chen <[email protected]>
ginnchen
parents:
diff changeset
    46
             if (PR_GetError() != PR_WOULD_BLOCK_ERROR) {
0a0292dce587 2010-03-04 Ginn Chen <[email protected]>
ginnchen
parents:
diff changeset
    47
               client_error = true;
0a0292dce587 2010-03-04 Ginn Chen <[email protected]>
ginnchen
parents:
diff changeset
    48
+              socketErrorState[s] = PR_TRUE;
0a0292dce587 2010-03-04 Ginn Chen <[email protected]>
ginnchen
parents:
diff changeset
    49
               // We got a fatal error while writting the buffer. Clear it to break
0a0292dce587 2010-03-04 Ginn Chen <[email protected]>
ginnchen
parents:
diff changeset
    50
               // the main loop, we will never more be able to send it.
0a0292dce587 2010-03-04 Ginn Chen <[email protected]>
ginnchen
parents:
diff changeset
    51
               buffers[s2].bufferhead = buffers[s2].buffertail = buffers[s2].buffer;