diff options
author | Nikos Mavrogiannopoulos <nmav@redhat.com> | 2018-07-23 15:01:49 +0200 |
---|---|---|
committer | Nikos Mavrogiannopoulos <nmav@redhat.com> | 2018-07-23 15:05:16 +0200 |
commit | 8376b7cb404c1f3994cb19735269a67f6bc5e5d3 (patch) | |
tree | f107d54357100985383f0a3f1b174c43e201d9a1 | |
parent | a9cee0ce9307789f461a68ea1b66f4b7fdfdab38 (diff) | |
download | gnutls-8376b7cb404c1f3994cb19735269a67f6bc5e5d3.tar.gz |
gnutls-serv: don't close connection properly when handshake is not yet complete
In the case handshake is not yet complete and we need
to terminate, it is because of an issue. As such prefer an
unclear termination at this stage. This addresses error detection
issues with tlsfuzzer.
Signed-off-by: Nikos Mavrogiannopoulos <nmav@redhat.com>
-rw-r--r-- | src/serv.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/src/serv.c b/src/serv.c index 42b4887bdc..4fc0759d5f 100644 --- a/src/serv.c +++ b/src/serv.c @@ -138,7 +138,7 @@ LIST_TYPE_DECLARE(listener_item, char *http_request; char *http_response; int listen_socket; int fd; gnutls_session_t tls_session; int handshake_ok; - int no_close; + int close_ok; time_t start; ); @@ -156,7 +156,7 @@ static void listener_free(listener_item * j) free(j->http_request); free(j->http_response); if (j->fd >= 0) { - if (j->no_close == 0) + if (j->close_ok) gnutls_bye(j->tls_session, GNUTLS_SHUT_WR); shutdown(j->fd, 2); close(j->fd); @@ -1263,7 +1263,7 @@ static void retry_handshake(listener_item *j) do { ret = gnutls_alert_send_appropriate(j->tls_session, r); } while (ret == GNUTLS_E_AGAIN || ret == GNUTLS_E_INTERRUPTED); - j->no_close = 1; + j->close_ok = 0; } else if (r == 0) { if (gnutls_session_is_resumed(j->tls_session) != 0 && verbose != 0) printf("*** This is a resumed session\n"); @@ -1281,14 +1281,16 @@ static void retry_handshake(listener_item *j) print_info(j->tls_session, verbose, verbose); } + j->close_ok = 1; j->handshake_ok = 1; } } static void try_rehandshake(listener_item *j) { -int r, ret; + int r, ret; fprintf(stderr, "*** Received hello message\n"); + do { r = gnutls_handshake(j->tls_session); } while (r == GNUTLS_E_INTERRUPTED || r == GNUTLS_E_AGAIN); @@ -1300,6 +1302,7 @@ int r, ret; fprintf(stderr, "Error in rehandshake: %s\n", gnutls_strerror(r)); j->http_state = HTTP_STATE_CLOSING; } else { + j->close_ok = 1; j->http_state = HTTP_STATE_REQUEST; } } @@ -1407,7 +1410,6 @@ static void tcp_server(const char *name, int port) (j->tls_session, accept_fd); set_read_funcs(j->tls_session); j->handshake_ok = 0; - j->no_close = 0; if (verbose != 0) { ctt = ctime(&tt); @@ -1461,7 +1463,7 @@ static void tcp_server(const char *name, int port) ret = gnutls_alert_send_appropriate(j->tls_session, r); } while (ret == GNUTLS_E_AGAIN || ret == GNUTLS_E_INTERRUPTED); GERR(r); - j->no_close = 1; + j->close_ok = 0; } } } else { |