[ 
https://issues.apache.org/jira/browse/TS-4522?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15354660#comment-15354660
 ] 

ASF GitHub Bot commented on TS-4522:
------------------------------------

Github user oknet commented on the issue:

    https://github.com/apache/trafficserver/pull/701
  
    @shinrich I remember that SSL_write would return “SSL_WANT_READ” error code.
    
    from: https://www.openssl.org/docs/manmaster/ssl/SSL_write.html
    If the underlying BIO is non-blocking, SSL_write() will also return, when 
the underlying BIO could not satisfy the needs of SSL_write() to continue the 
operation. In this case a call to SSL_get_error with the return value of 
SSL_write() will yield SSL_ERROR_WANT_READ or SSL_ERROR_WANT_WRITE. As at any 
time a re-negotiation is possible, a call to SSL_write() can also cause read 
operations! The calling process then must repeat the call after taking 
appropriate action to satisfy the needs of SSL_write(). The action depends on 
the underlying BIO. When using a non-blocking socket, nothing is to be done, 
but select() can be used to check for the required condition. When using a 
buffering BIO, like a BIO pair, data must be written into or retrieved out of 
the BIO before being able to continue.
    
    Is the code added for handle SSL_ERROR_WANT_READ or related ?


> did not check EPIPE on write_to_net_io
> --------------------------------------
>
>                 Key: TS-4522
>                 URL: https://issues.apache.org/jira/browse/TS-4522
>             Project: Traffic Server
>          Issue Type: Bug
>          Components: Core, Network
>            Reporter: Oknet Xu
>            Assignee: Oknet Xu
>             Fix For: 7.0.0
>
>
> On a closed socket fd:
> read(socketfd) return 0
> write(socketfd) return EPIPE
> In the write_to_net_io, we check the return value of write() with the same 
> way to read().
> {code}
>     if (!r || r == -ECONNRESET) {
> {code}
> The bug makes no VC_EVENT_EOS callbacked while write_to_net_io, but 
> VC_EVENT_ERROR instead. 
> full code here:
> {code}
>   int64_t r = vc->load_buffer_and_write(towrite, buf, total_written, needs);
>   if (total_written > 0) {
>     NET_SUM_DYN_STAT(net_write_bytes_stat, total_written);
>     s->vio.ndone += total_written;
>   }
>   // check for errors
>   if (r <= 0) { // if the socket was not ready,add to WaitList
>     if (r == -EAGAIN || r == -ENOTCONN) {
>       NET_INCREMENT_DYN_STAT(net_calls_to_write_nodata_stat);
>       if ((needs & EVENTIO_WRITE) == EVENTIO_WRITE) {
>         vc->write.triggered = 0;
>         nh->write_ready_list.remove(vc);
>         write_reschedule(nh, vc);
>       }
>       if ((needs & EVENTIO_READ) == EVENTIO_READ) {
>         vc->read.triggered = 0;
>         nh->read_ready_list.remove(vc);
>         read_reschedule(nh, vc);
>       }
>       return;
>     }
>     if (!r || r == -ECONNRESET) {
>       vc->write.triggered = 0;
>       write_signal_done(VC_EVENT_EOS, nh, vc);
>       return;
>     }
>     vc->write.triggered = 0;
>     write_signal_error(nh, vc, (int)-total_written);
>     return;
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to