Navigation


Changeset 30:bca243c65b56 in freeDiameter for freeDiameter/cnxctx.c


Ignore:
Timestamp:
Oct 28, 2009, 4:32:25 PM (15 years ago)
Author:
Sebastien Decugis <sdecugis@nict.go.jp>
Branch:
default
Phase:
public
Message:

Fix some segfaults

File:
1 edited

Legend:

Unmodified
Added
Removed
  • freeDiameter/cnxctx.c

    r29 r30  
    931931}
    932932
     933/* Wrapper around gnutls_record_recv to handle some error codes */
     934static ssize_t fd_tls_send_handle_error(struct cnxctx * conn, gnutls_session_t session, void * data, size_t sz)
     935{
     936        ssize_t ret;
     937again: 
     938        CHECK_GNUTLS_DO( ret = gnutls_record_send(session, data, sz),
     939                {
     940                        switch (ret) {
     941                                case GNUTLS_E_REHANDSHAKE:
     942                                        CHECK_GNUTLS_DO( ret = gnutls_handshake(session),
     943                                                {
     944                                                        if (TRACE_BOOL(INFO)) {
     945                                                                fd_log_debug("TLS re-handshake failed on socket %d (%s) : %s\n", conn->cc_socket, conn->cc_id, gnutls_strerror(ret));
     946                                                        }
     947                                                        goto end;
     948                                                } );
     949
     950                                case GNUTLS_E_AGAIN:
     951                                case GNUTLS_E_INTERRUPTED:
     952                                        goto again;
     953
     954                                default:
     955                                        TRACE_DEBUG(INFO, "This TLS error is not handled, assume unrecoverable error");
     956                        }
     957                } );
     958end:   
     959        return ret;
     960}
     961
     962
     963
    933964/* Send function when no multi-stream is involved, or sending on stream #0 (send() always use stream 0)*/
    934965static int send_simple(struct cnxctx * conn, unsigned char * buf, size_t len)
     
    939970        do {
    940971                if (conn->cc_tls) {
    941                         CHECK_GNUTLS_DO( ret = gnutls_record_send (conn->cc_tls_para.session, buf + sent, len - sent), return ENOTCONN );
     972                        CHECK_GNUTLS_DO( ret = fd_tls_send_handle_error(conn, conn->cc_tls_para.session, buf + sent, len - sent), return ENOTCONN );
    942973                } else {
    943974                        CHECK_SYS( ret = send(conn->cc_socket, buf + sent, len - sent, 0) ); /* better to replace with sendmsg for atomic sending? */
     
    9841015                                        ASSERT(conn->cc_sctps_data.array != NULL);
    9851016                                        do {
    986                                                 CHECK_GNUTLS_DO( ret = gnutls_record_send (conn->cc_sctps_data.array[conn->cc_sctp_para.next - 1].session, buf + sent, len - sent), { TODO("Handle error (re-handshake, etc.."); return ENOTCONN; } );
     1017                                                CHECK_GNUTLS_DO( ret = fd_tls_send_handle_error(conn, conn->cc_sctps_data.array[conn->cc_sctp_para.next].session, buf + sent, len - sent), return ENOTCONN );
    9871018                                                sent += ret;
    9881019                                        } while ( sent < len );
Note: See TracChangeset for help on using the changeset viewer.