Changeset 4addf74 in mod_gnutls for src/gnutls_io.c


Ignore:
Timestamp:
Aug 22, 2015, 3:30:24 PM (5 years ago)
Author:
Daniel Kahn Gillmor <dkg@…>
Branches:
debian/master, debian/stretch-backports, jessie-backports, upstream
Children:
71e9a5c, 89f863f
Parents:
ae29683 (diff), a1c4c2d (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Imported Upstream version 0.7

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/gnutls_io.c

    rae29683 r4addf74  
    33 *  Copyright 2008 Nikos Mavrogiannopoulos
    44 *  Copyright 2011 Dash Shendy
     5 *  Copyright 2015 Thomas Klute
    56 *
    67 *  Licensed under the Apache License, Version 2.0 (the "License");
     
    2021#include "mod_gnutls.h"
    2122
     23#ifdef APLOG_USE_MODULE
     24APLOG_USE_MODULE(gnutls);
     25#endif
     26
    2227/**
    2328 * Describe how the GnuTLS Filter system works here
     
    3439                               alloc)
    3540
     41#define IS_PROXY_STR(c) \
     42    ((c->is_proxy == GNUTLS_ENABLED_TRUE) ? "proxy " : "")
     43
    3644static apr_status_t gnutls_io_filter_error(ap_filter_t * f,
    3745        apr_bucket_brigade * bb,
     
    4149
    4250    switch (status) {
    43         case HTTP_BAD_REQUEST:
    44             /* log the situation */
    45             ap_log_error(APLOG_MARK, APLOG_INFO, 0,
    46                     f->c->base_server,
    47                     "GnuTLS handshake failed: HTTP spoken on HTTPS port; "
    48                     "trying to send HTML error page");
    49 
    50                                     mgs_srvconf_rec *sc = (mgs_srvconf_rec *) ap_get_module_config(
    51                                                                                                                                                                                                                                 f->c->base_server->module_config,
    52                                                                                                                                                                                                                                 &gnutls_module
    53                                                                                                                                                                                                                         );
    54             ctxt->status = -1;
    55             sc->non_ssl_request = 1;
    56 
    57             /* fake the request line */
    58             bucket = HTTP_ON_HTTPS_PORT_BUCKET(f->c->bucket_alloc);
    59             break;
    60 
    61         default:
    62             return status;
     51    case HTTP_BAD_REQUEST:
     52        /* log the situation */
     53        ap_log_error(APLOG_MARK, APLOG_INFO, 0,
     54                     f->c->base_server,
     55                     "GnuTLS handshake failed: HTTP spoken on HTTPS port; "
     56                     "trying to send HTML error page");
     57        mgs_srvconf_rec *sc = (mgs_srvconf_rec *)
     58            ap_get_module_config(f->c->base_server->module_config,
     59                                 &gnutls_module);
     60        ctxt->status = -1;
     61        sc->non_ssl_request = 1;
     62
     63        /* fake the request line */
     64        bucket = HTTP_ON_HTTPS_PORT_BUCKET(f->c->bucket_alloc);
     65        break;
     66
     67    default:
     68        return status;
    6369    }
    6470
     
    182188
    183189static apr_status_t gnutls_io_input_read(mgs_handle_t * ctxt,
    184         char *buf, apr_size_t * len) {
     190        char *buf, apr_size_t * len)
     191{
    185192    apr_size_t wanted = *len;
    186193    apr_size_t bytes = 0;
     
    221228
    222229    if (ctxt->session == NULL) {
     230        ap_log_cerror(APLOG_MARK, APLOG_INFO, 0, ctxt->c,
     231                      "%s: GnuTLS session is NULL!", __func__);
    223232        return APR_EGENERAL;
    224233    }
     
    226235    while (1) {
    227236
    228         rc = gnutls_record_recv(ctxt->session, buf + bytes,
    229                 wanted - bytes);
     237        do
     238            rc = gnutls_record_recv(ctxt->session, buf + bytes,
     239                                    wanted - bytes);
     240        while (rc == GNUTLS_E_INTERRUPTED || rc == GNUTLS_E_AGAIN);
    230241
    231242        if (rc > 0) {
     
    266277            if (rc == GNUTLS_E_REHANDSHAKE) {
    267278                /* A client has asked for a new Hankshake. Currently, we don't do it */
    268                 ap_log_error(APLOG_MARK, APLOG_INFO,
     279                ap_log_cerror(APLOG_MARK, APLOG_INFO,
    269280                        ctxt->input_rc,
    270                         ctxt->c->base_server,
     281                        ctxt->c,
    271282                        "GnuTLS: Error reading data. Client Requested a New Handshake."
    272283                        " (%d) '%s'", rc,
     
    274285            } else if (rc == GNUTLS_E_WARNING_ALERT_RECEIVED) {
    275286                rc = gnutls_alert_get(ctxt->session);
    276                 ap_log_error(APLOG_MARK, APLOG_INFO,
     287                ap_log_cerror(APLOG_MARK, APLOG_INFO,
    277288                        ctxt->input_rc,
    278                         ctxt->c->base_server,
     289                        ctxt->c,
    279290                        "GnuTLS: Warning Alert From Client: "
    280291                        " (%d) '%s'", rc,
     
    282293            } else if (rc == GNUTLS_E_FATAL_ALERT_RECEIVED) {
    283294                rc = gnutls_alert_get(ctxt->session);
    284                 ap_log_error(APLOG_MARK, APLOG_INFO,
     295                ap_log_cerror(APLOG_MARK, APLOG_INFO,
    285296                        ctxt->input_rc,
    286                         ctxt->c->base_server,
     297                        ctxt->c,
    287298                        "GnuTLS: Fatal Alert From Client: "
    288299                        "(%d) '%s'", rc,
     
    293304                /* Some Other Error. Report it. Die. */
    294305                if (gnutls_error_is_fatal(rc)) {
    295                     ap_log_error(APLOG_MARK,
     306                    ap_log_cerror(APLOG_MARK,
    296307                            APLOG_INFO,
    297308                            ctxt->input_rc,
    298                             ctxt->c->base_server,
     309                            ctxt->c,
    299310                            "GnuTLS: Error reading data. (%d) '%s'",
    300311                            rc,
     
    307318
    308319            if (ctxt->input_rc == APR_SUCCESS) {
     320                ap_log_cerror(APLOG_MARK, APLOG_INFO, ctxt->input_rc, ctxt->c,
     321                              "%s: GnuTLS error: %s (%d)",
     322                              __func__, gnutls_strerror(rc), rc);
    309323                ctxt->input_rc = APR_EGENERAL;
    310324            }
     
    401415            ap_log_error(APLOG_MARK, APLOG_INFO, 0,
    402416                    ctxt->c->base_server,
    403                     "GnuTLS: Hanshake Alert (%d) '%s'.",
     417                    "GnuTLS: Handshake Alert (%d) '%s'.",
    404418                    errcode,
    405419                    gnutls_alert_get_name(errcode));
     
    445459            }
    446460        }
    447         return 0;
     461        return GNUTLS_E_SUCCESS;
    448462    }
    449463}
     
    475489        apr_bucket_brigade * bb,
    476490        ap_input_mode_t mode,
    477         apr_read_type_e block, apr_off_t readbytes) {
     491        apr_read_type_e block, apr_off_t readbytes)
     492{
    478493    apr_status_t status = APR_SUCCESS;
    479494    mgs_handle_t *ctxt = (mgs_handle_t *) f->ctx;
     
    484499                apr_bucket_eos_create(f->c->bucket_alloc);
    485500        APR_BRIGADE_INSERT_TAIL(bb, bucket);
     501        ap_log_cerror(APLOG_MARK, APLOG_DEBUG, 0, ctxt->c,
     502                      "%s: %sconnection aborted",
     503                      __func__, IS_PROXY_STR(ctxt));
    486504        return APR_ECONNABORTED;
    487505    }
    488506
    489507    if (ctxt->status == 0) {
    490         gnutls_do_handshake(ctxt);
     508        int ret = gnutls_do_handshake(ctxt);
     509        if (ret == GNUTLS_E_SUCCESS)
     510            ap_log_cerror(APLOG_MARK, APLOG_DEBUG, 0, ctxt->c,
     511                          "%s: TLS %sconnection opened.",
     512                          __func__, IS_PROXY_STR(ctxt));
    491513    }
    492514
    493515    if (ctxt->status < 0) {
     516        ap_log_cerror(APLOG_MARK, APLOG_DEBUG, 0, ctxt->c,
     517                      "%s %s: ap_get_brigade", __func__, IS_PROXY_STR(ctxt));
    494518        return ap_get_brigade(f->next, bb, mode, block, readbytes);
    495519    }
     
    506530    if (ctxt->input_mode == AP_MODE_READBYTES ||
    507531            ctxt->input_mode == AP_MODE_SPECULATIVE) {
     532        if (readbytes < 0) {
     533            /* you're asking us to speculatively read a negative number of bytes! */
     534            return APR_ENOTIMPL;
     535        }
    508536        /* Err. This is bad. readbytes *can* be a 64bit int! len.. is NOT */
    509         if (readbytes < len) {
     537        if ((apr_size_t) readbytes < len) {
    510538            len = (apr_size_t) readbytes;
    511539        }
     
    569597
    570598apr_status_t mgs_filter_output(ap_filter_t * f, apr_bucket_brigade * bb) {
    571     apr_size_t ret;
     599    int ret;
    572600    mgs_handle_t *ctxt = (mgs_handle_t *) f->ctx;
    573601    apr_status_t status = APR_SUCCESS;
     
    580608
    581609    if (ctxt->status == 0) {
    582         gnutls_do_handshake(ctxt);
     610        ret = gnutls_do_handshake(ctxt);
     611        if (ret == GNUTLS_E_SUCCESS)
     612            ap_log_cerror(APLOG_MARK, APLOG_DEBUG, 0, ctxt->c,
     613                          "%s: TLS %sconnection opened.",
     614                          __func__, IS_PROXY_STR(ctxt));
    583615    }
    584616
     
    607639                    ret = gnutls_bye(ctxt->session, GNUTLS_SHUT_WR);
    608640                } while (ret == GNUTLS_E_INTERRUPTED || ret == GNUTLS_E_AGAIN);
     641                if (ret != GNUTLS_E_SUCCESS)
     642                    ap_log_cerror(APLOG_MARK, APLOG_DEBUG, 0, ctxt->c,
     643                                  "%s: Error while closing TLS %sconnection: "
     644                                  "'%s' (%d)",
     645                                  __func__, IS_PROXY_STR(ctxt),
     646                                  gnutls_strerror(ret), (int) ret);
     647                else
     648                    ap_log_cerror(APLOG_MARK, APLOG_DEBUG, 0, ctxt->c,
     649                                  "%s: TLS %sconnection closed.",
     650                                  __func__, IS_PROXY_STR(ctxt));
    609651                /* De-Initialize Session */
    610652                gnutls_deinit(ctxt->session);
     
    668710                        return ctxt->output_rc;
    669711                    }
    670                 } else if (ret != len) {
     712                } else if ((apr_size_t)(ret) != len) {
     713                    /* we know the above cast is OK because len > 0 and ret >= 0 */
    671714                    /* Not able to send the entire bucket,
    672715                       split it and send it again. */
Note: See TracChangeset for help on using the changeset viewer.