David Schwartz wrote:
> Joakim Tjernlund wrote:
>
>> I once wrote this patch to solve a problem which I logged to be:
>>  Let EAGAIN be fatal for write to socket. Needed
>>  to unlock a hung connection where the www client has
>>  stopped reading its socket.
>
>Umm, if your code asks to wait forever until it can write, then that is what
>it should do. The fix is nonsensical.
>
>> I cannot remember the details so I post the patch in hope it makes
>> sense to anyone. Possibly I have solved the problem at the wrong place.
>> Anyhow, here goes the patch:
>
>You definitely solved the problem in the wrong place. If you don't want to
>wait forever for a write to be possible, then don't do that. But if you do
>that, then that's what should happen.
>
>
>> Index: crypto/bio/bss_conn.c
>> ===================================================================
>> --- crypto/bio/bss_conn.c             (revision 31831)
>> +++ crypto/bio/bss_conn.c             (revision 31832)
>> @@ -444,7 +444,11 @@
>>               if (ret <= 0)
>>                               {
>>                               if (BIO_sock_should_retry(ret))
>> -                                             BIO_set_retry_write(b);
>> +                                             if (get_last_socket_error() == 
>> EAGAIN) {
>> +                                                             
>> get_last_socket_error() = ECONNRESET;
>> +                                                             
>> shutdown(b->num, SHUT_WR);
>> +                                             } else
>> +                                                             
>> BIO_set_retry_write(b);
>>                               }
>>               return(ret);
>>               }
>> Index: crypto/bio/bss_sock.c
>> ===================================================================
>> --- crypto/bio/bss_sock.c             (revision 31831)
>> +++ crypto/bio/bss_sock.c             (revision 31832)
>> @@ -159,7 +159,11 @@
>>               if (ret <= 0)
>>                               {
>>                               if (BIO_sock_should_retry(ret))
>> -                                             BIO_set_retry_write(b);
>> +                                             if (get_last_socket_error() == 
>> EAGAIN) {
>> +                                                             
>> get_last_socket_error() = ECONNRESET;
>> +                                                             
>> shutdown(b->num, SHUT_WR);
>> +                                             } else
>> +                                                             
>> BIO_set_retry_write(b);
>>                               }
>>               return(ret);
>>               }
>
>A "hung connection" *should* remain locked if the client stops reading from
>its socket. The client might continue reading from its connection in a day,
>a week, or a year. If the server wants to timeout the connection, it can and
>should do so.

Right, but I could not find how/where to do so. Can you give me some hints?

    Jocke

PS.
   Please keep me on CC: list
______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
Development Mailing List                       openssl-dev@openssl.org
Automated List Manager                           majord...@openssl.org

Reply via email to