Changeset 2139

Show
Ignore:
Timestamp:
03/28/2008 04:33:15 PM (5 months ago)
Author:
stbuehler
Message:

Fixed SSL_shutdown error handling problems which became visible after [2136].

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • branches/lighttpd-1.4.x/src/connections.c

    r2136 r2139  
    16701670#ifdef USE_OPENSSL 
    16711671                        if (srv_sock->is_ssl) { 
    1672                                 int ret; 
     1672                                int ret, ssl_r; 
     1673                                unsigned long err; 
    16731674                                ERR_clear_error(); 
    16741675                                switch ((ret = SSL_shutdown(con->ssl))) { 
     
    16781679                                case 0: 
    16791680                                        ERR_clear_error(); 
    1680                                         if ((ret = SSL_shutdown(con->ssl)) == 1) break; 
     1681                                        if (-1 != (ret = SSL_shutdown(con->ssl))) break; 
    16811682 
    16821683                                        // fall through 
    16831684                                default: 
    1684                                         log_error_write(srv, __FILE__, __LINE__, "sds", "SSL:", 
    1685                                                         SSL_get_error(con->ssl, ret), 
    1686                                                         ERR_error_string(ERR_get_error(), NULL)); 
    1687                                         return -1; 
     1685 
     1686                                        switch ((ssl_r = SSL_get_error(con->ssl, ret))) { 
     1687                                        case SSL_ERROR_WANT_WRITE: 
     1688                                        case SSL_ERROR_WANT_READ: 
     1689                                                break; 
     1690                                        case SSL_ERROR_SYSCALL: 
     1691                                                /* perhaps we have error waiting in our error-queue */ 
     1692                                                if (0 != (err = ERR_get_error())) { 
     1693                                                        do { 
     1694                                                                log_error_write(srv, __FILE__, __LINE__, "sdds", "SSL:", 
     1695                                                                                ssl_r, ret, 
     1696                                                                                ERR_error_string(err, NULL)); 
     1697                                                        } while((err = ERR_get_error())); 
     1698                                                } else { 
     1699                                                        log_error_write(srv, __FILE__, __LINE__, "sddds", "SSL (error):", 
     1700                                                                        ssl_r, r, errno, 
     1701                                                                        strerror(errno)); 
     1702                                                } 
     1703         
     1704                                                break; 
     1705                                        default: 
     1706                                                while((err = ERR_get_error())) { 
     1707                                                        log_error_write(srv, __FILE__, __LINE__, "sdds", "SSL:", 
     1708                                                                        ssl_r, ret, 
     1709                                                                        ERR_error_string(err, NULL)); 
     1710                                                } 
     1711         
     1712                                                break; 
     1713                                        } 
    16881714                                } 
    16891715                        } 
     1716                        ERR_clear_error(); 
    16901717#endif 
    16911718