diff --git a/lib/modules/SSL.pmod/Constants.pmod b/lib/modules/SSL.pmod/Constants.pmod index 18c8f427b6952073afcd4fa96ea11ec204b39c4e..4f63fc1c953c97a31c112db545ef897fdbfc796e 100644 --- a/lib/modules/SSL.pmod/Constants.pmod +++ b/lib/modules/SSL.pmod/Constants.pmod @@ -115,13 +115,28 @@ constant STATE_wait_for_finish = 3; //! @[CONNECTION_handshaking]. enum ConnectionState { CONNECTION_ready = 0x0000, //! Connection is ready for use. + + // Handshaking. CONNECTION_handshaking = 0x0100, //! Handshaking not done. + + // Peer. CONNECTION_peer_closed = 0x0001, //! Peer has closed the connection. CONNECTION_peer_fatal = 0x0002, //! Peer has issued a fatal alert. + + // Local. CONNECTION_local_closed = 0x0010, //! Local close packet sent. CONNECTION_local_fatal = 0x0020, //! Fatal alert sent. CONNECTION_local_closing = 0x0040, //! Local close packet pending. CONNECTION_local_failing = 0x0080, //! Fatal alert pending. + + // Some composite values. + CONNECTION_closed = 0x0011, //! Closed at both ends. + CONNECTION_closing = 0x0051, //! Connection closing mask. + + CONNECTION_peer_down = 0x000f, //! Peer mask. + CONNECTION_local_down = 0x00f0, //! Local mask. + + CONNECTION_failing = 0x00a2, //! Connection failing mask. }; /* Cipher specification */ diff --git a/lib/modules/SSL.pmod/sslfile.pike b/lib/modules/SSL.pmod/sslfile.pike index ad021acc0cae7f9cdea45ab556277be26b0ac00c..49be58b82c7c7b96af6493780581c008f317127b 100644 --- a/lib/modules/SSL.pmod/sslfile.pike +++ b/lib/modules/SSL.pmod/sslfile.pike @@ -211,8 +211,7 @@ protected constant epipe_errnos = (< #define SSL_INTERNAL_READING \ (SSL_HANDSHAKING || \ (close_state == CLEAN_CLOSE ? \ - ((conn->state & (CONNECTION_local_closed | CONNECTION_peer_closed)) == \ - CONNECTION_local_closed) : \ + ((conn->state & CONNECTION_closed) == CONNECTION_local_closed) : \ close_packet_send_state == CLOSE_PACKET_MAYBE_IGNORED_WRITE_ERROR)) // Try to write when there's data in the write buffer or when we have @@ -818,8 +817,7 @@ Stdio.File shutdown() switch (close_state) { case CLEAN_CLOSE: - if ((conn_state & (CONNECTION_peer_closed|CONNECTION_local_closed)) == - (CONNECTION_peer_closed | CONNECTION_local_closed)) { + if ((conn_state & CONNECTION_closed) == CONNECTION_closed) { SSL3_DEBUG_MSG ("SSL.sslfile->shutdown(): Clean close - " "leaving stream\n"); local_errno = 0; @@ -1598,24 +1596,18 @@ int is_open() // essentially doing a peek and call ssl_read_callback directly, // but that'd lead to subtle code duplication. (Also, peek is // currently not implemented on NT.) - ConnectionState closed = conn->state & - (CONNECTION_local_closed | CONNECTION_peer_closed); + ConnectionState closed = conn->state & CONNECTION_closed; if ((close_state == CLEAN_CLOSE ? - closed != (CONNECTION_local_closed | CONNECTION_peer_closed) : - !closed)) + closed != CONNECTION_closed : !closed)) RUN_MAYBE_BLOCKING ( action && (close_state == CLEAN_CLOSE ? - (conn->state & - (CONNECTION_local_closed | CONNECTION_peer_closed)) != - (CONNECTION_local_closed | CONNECTION_peer_closed) : - !(conn->state & - (CONNECTION_local_closed | CONNECTION_peer_closed))), + (conn->state & CONNECTION_closed) != CONNECTION_closed : + !(conn->state & CONNECTION_closed)), 1, 1, RETURN (!epipe_errnos[local_errno])); - closed = conn->state & - (CONNECTION_local_closed | CONNECTION_peer_closed); + closed = conn->state & CONNECTION_closed; RETURN (conn && (close_state == CLEAN_CLOSE ? - closed != (CONNECTION_local_closed | CONNECTION_peer_closed) && 2 : !closed)); + (closed != CONNECTION_closed) && 2 : !closed)); } } LEAVE; return 0; @@ -2200,7 +2192,7 @@ protected int ssl_write_callback (int called_from_real_backend) if (int err = queue_write()) { if (err > 0) { #ifdef SSLFILE_DEBUG - if (!(conn->state & (CONNECTION_local_closed|CONNECTION_peer_closed)) || + if (!(conn->state & CONNECTION_closed) || close_packet_send_state < CLOSE_PACKET_QUEUED_OR_DONE) error ("Expected a close to be sent or received\n"); #endif