Changeset 2140

Show
Ignore:
Timestamp:
03/30/2008 01:19:53 PM (5 months ago)
Author:
stbuehler
Message:

fix ssl error queue handling (#285) (CVE-2008-1531)

Location:
trunk
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • trunk/NEWS

    r2135 r2140  
    2727  * fcgi-stat-accel: Fix unused var / indentation 
    2828  * fix mod_compress bug (#1027) 
     29  * fix ssl error queue handling (#285) (CVE-2008-1531) 
    2930 
    3031- 1.5.0-r19.. - 
  • trunk/src/connections.c

    r2131 r2140  
    103103 
    104104        if (con->sock->ssl) { 
    105                 switch (SSL_shutdown(con->sock->ssl)) { 
     105                int ret, ssl_r; 
     106                unsigned long err; 
     107 
     108                ERR_clear_error(); 
     109                switch (ret = SSL_shutdown(con->sock->ssl)) { 
    106110                case 1: 
    107111                        /* done */ 
     
    111115                         * 
    112116                         * FIXME: wait for fdevent and call SSL_shutdown again 
    113                          * 
     117                         * (But it is not that important as we close the underlying connection anyway) 
    114118                         */ 
    115119 
    116120                        break; 
    117121                default: 
    118                         ERROR("SSL_shutdown failed: %s", ERR_error_string(ERR_get_error(), NULL)); 
     122                        switch ((ssl_r = SSL_get_error(con->sock->ssl, ret))) { 
     123                        case SSL_ERROR_WANT_WRITE: 
     124                        case SSL_ERROR_WANT_READ: 
     125                                break; 
     126                        case SSL_ERROR_SYSCALL: 
     127                                /* perhaps we have error waiting in our error-queue */ 
     128                                if (0 != (err = ERR_get_error())) { 
     129                                        do { 
     130                                                ERROR("SSL_shutdown failed (%i, %i): %s", ssl_r, ret, ERR_error_string(err, NULL)); 
     131                                        } while((err = ERR_get_error())); 
     132                                } else { 
     133                                        ERROR("SSL_shutdown failed (%i, %i, %i): %s", ssl_r, ret, errno, strerror(errno)); 
     134                                } 
     135 
     136                                break; 
     137                        default: 
     138                                while((err = ERR_get_error())) { 
     139                                        ERROR("SSL_shutdown failed (%i, %i): %s", ssl_r, ret, ERR_error_string(err, NULL)); 
     140                                } 
     141                        } 
    119142                } 
    120143 
    121144                SSL_free(con->sock->ssl); 
     145                ERR_clear_error(); 
    122146                con->sock->ssl = NULL; 
    123147        } 
  • trunk/src/network_openssl.c

    r2131 r2140  
    4545                b = chunkqueue_get_append_buffer(cq); 
    4646                buffer_prepare_copy(b, 8192 + 12); /* ssl-chunk-size is 8kb */ 
     47                ERR_clear_error(); 
    4748                len = SSL_read(sock->ssl, b->ptr, b->size - 1); 
    4849 
     
    184185                         */ 
    185186 
     187                        ERR_clear_error(); 
    186188                        if (toSend != 0 && (r = SSL_write(sock->ssl, offset, toSend)) <= 0) { 
    187189                                unsigned long err; 
     
    288290                                close(ifd); 
    289291 
     292                                ERR_clear_error(); 
    290293                                if ((r = SSL_write(sock->ssl, s, toSend)) <= 0) { 
    291294                                        unsigned long err;