https://issues.apache.org/bugzilla/show_bug.cgi?id=54085

          Priority: P2
            Bug ID: 54085
          Assignee: dev@tomcat.apache.org
           Summary: ssl_socket_recv sometimes loops infinitely with
                    non-blocking sockets
          Severity: normal
    Classification: Unclassified
                OS: Linux
          Reporter: and...@art.su
          Hardware: PC
            Status: NEW
           Version: 1.1.24
         Component: Library
           Product: Tomcat Native

Java-based server using Tomcat Native sometimes falls into a busy loop
consuming 100% CPU.
The native stack trace of the problem:

Thread 58 (Thread 1249868096 (LWP 29778)):
#0  0x00007fdf3ca93e6b in __read_nocancel () from /lib64/libpthread.so.0
#1  0x00007fdf2205f092 in sock_read (b=0x7fdec7bc58a0, out=0x7fdeb0b31448,
outl=3869) at /usr/include/bits/unistd.h:35
#2  0x00007fdf2205d56f in BIO_read (b=0x7fdec7bc58a0, out=0x7fdeb0b31448,
outl=3869) at bio_lib.c:212
#3  0x00007fdf2234795b in ssl3_read_n (s=0x7fdec5a51340, n=6624, max=6624,
extend=<value optimized out>) at s3_pkt.c:199
#4  0x00007fdf22347efe in ssl3_read_bytes (s=0x7fdec5a51340, type=23,
buf=0x7fdeb9a70000, len=4096, peek=0) at s3_pkt.c:324
#5  0x00007fdf223458c8 in ssl3_read (s=0x7fdec5a51340, buf=0x7fdeb9a70000,
len=4096) at s3_lib.c:2574
#6  0x00007fdf2258c36e in ssl_socket_recv (sock=0x7fdeb9b2c8b0,
buf=0x7fdeb9a70000, len=0x4a7f6a38) at src/sslnetwork.c:397
#7  0x00007fdf2258aa10 in Java_org_apache_tomcat_jni_Socket_recvbt (e=<value
optimized out>, o=<value optimized out>, sock=140594574968408, buf=<value
optimized out>, offset=0, len=<value optimized out>, timeout=1000) at
src/network.c:972

The infinite loop appears to be in ssl_socket_recv() with the following
scenario:
1. SSL_read() at line 397 returns -1;
2. apr_get_netos_error() at line 398 returns EAGAIN;
3. SSL_get_error() at line 402 returns SSL_ERROR_SSL.

The socket is in O_NONBLOCK mode. SSL handshake has passed.

Here is the patch that helped me to overcome the problem:

*** sslnetwork.c
--- sslnetwork-patched.c
***************
*** 420,429 ****
                  break;
                  case SSL_ERROR_SYSCALL:
                  case SSL_ERROR_SSL:
!                     if (!APR_STATUS_IS_EAGAIN(os) &&
!                         !APR_STATUS_IS_EINTR(os)) {
                          con->shutdown_type = SSL_SHUTDOWN_TYPE_UNCLEAN;
!                         return os == APR_SUCCESS ? APR_EGENERAL : os;
                      }
                  break;
                  default:
--- 420,428 ----
                  break;
                  case SSL_ERROR_SYSCALL:
                  case SSL_ERROR_SSL:
!                     if (!APR_STATUS_IS_EINTR(os)) {
                          con->shutdown_type = SSL_SHUTDOWN_TYPE_UNCLEAN;
!                         return os == APR_SUCCESS || APR_STATUS_IS_EAGAIN(os)
? APR_EGENERAL : os;
                      }
                  break;
                  default:

-- 
You are receiving this mail because:
You are the assignee for the bug.

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to