Changeset 02a6a18 in mod_gnutls


Ignore:
Timestamp:
Nov 11, 2015, 8:34:01 PM (7 years ago)
Author:
Thomas Klute <thomas2.klute@…>
Branches:
asyncio, debian/master, debian/stretch-backports, jessie-backports, main, master, proxy-ticket, upstream
Children:
f5a36ee
Parents:
a61edfd
Message:

gnutls_io.c: Don't mix EAGAIN and EINTR in mgs_transport_read

Properly distinguishing EAGAIN and EINTR should help with connection
status handling. Previously EINTR was passed to GnuTLS on APR_EINTR and
APR_EAGAIN alike.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/gnutls_io.c

    ra61edfd r02a6a18  
    4141#define IS_PROXY_STR(c) \
    4242    ((c->is_proxy == GNUTLS_ENABLED_TRUE) ? "proxy " : "")
     43
     44/**
     45 * Convert APR_EINTR or APR_EAGAIN to the match raw error code. Needed
     46 * to pass the status on to GnuTLS from the pull function.
     47 */
     48#define EAI_APR_TO_RAW(s) (APR_STATUS_IS_EAGAIN(s) ? EAGAIN : EINTR)
     49
     50
    4351
    4452static apr_status_t gnutls_io_filter_error(ap_filter_t * f,
     
    725733}
    726734
     735/**
     736 * Pull function for GnuTLS
     737 */
    727738ssize_t mgs_transport_read(gnutls_transport_ptr_t ptr,
    728         void *buffer, size_t len) {
     739                           void *buffer, size_t len)
     740{
    729741    mgs_handle_t *ctxt = ptr;
    730742    apr_status_t rc;
     
    752764         */
    753765        if (APR_STATUS_IS_EAGAIN(rc) || APR_STATUS_IS_EINTR(rc)
    754                 || (rc == APR_SUCCESS
    755                 && APR_BRIGADE_EMPTY(ctxt->input_bb))) {
    756 
    757             if (APR_STATUS_IS_EOF(ctxt->input_rc)) {
     766            || (rc == APR_SUCCESS
     767                && APR_BRIGADE_EMPTY(ctxt->input_bb)))
     768        {
     769            if (APR_STATUS_IS_EOF(ctxt->input_rc))
     770            {
    758771                return 0;
    759             } else {
     772            }
     773            else
     774            {
    760775                if (ctxt->session)
    761                     gnutls_transport_set_errno(ctxt->
    762                         session,
    763                         EINTR);
     776                    gnutls_transport_set_errno(ctxt->session,
     777                                               EAI_APR_TO_RAW(ctxt->input_rc));
    764778                return -1;
    765779            }
    766780        }
    767 
    768781
    769782        if (rc != APR_SUCCESS) {
     
    783796
    784797    if (APR_STATUS_IS_EAGAIN(ctxt->input_rc)
    785             || APR_STATUS_IS_EINTR(ctxt->input_rc)) {
    786         if (len == 0) {
     798        || APR_STATUS_IS_EINTR(ctxt->input_rc))
     799    {
     800        if (len == 0)
     801        {
    787802            if (ctxt->session)
    788803                gnutls_transport_set_errno(ctxt->session,
    789                     EINTR);
     804                                           EAI_APR_TO_RAW(ctxt->input_rc));
    790805            return -1;
    791806        }
Note: See TracChangeset for help on using the changeset viewer.