diff options
author | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2020-03-18 11:23:47 +0100 |
---|---|---|
committer | Ander Juaristi <a@juaristi.eus> | 2020-03-23 17:00:58 +0100 |
commit | ded59e682aeef30c7ae172cc22700f8f92faeb76 (patch) | |
tree | 3a704af0b0c44bf99d4b204ab34c1f9017cb6d78 | |
parent | 7e43ed8acceb84f140ed090195b3100d80f3ccc2 (diff) | |
download | gnutls-ajuaristi-issue-586.tar.gz |
_gnutls_check_id_for_change: ensure that we check the username lengthajuaristi-issue-586
Signed-off-by: Nikos Mavrogiannopoulos <nmav@gnutls.org>
-rw-r--r-- | lib/gnutls_int.h | 2 | ||||
-rw-r--r-- | lib/handshake-checks.c | 9 | ||||
-rw-r--r-- | lib/state.c | 2 |
3 files changed, 8 insertions, 5 deletions
diff --git a/lib/gnutls_int.h b/lib/gnutls_int.h index 4ea8159979..9959c82202 100644 --- a/lib/gnutls_int.h +++ b/lib/gnutls_int.h @@ -1445,7 +1445,7 @@ typedef struct { /* The saved username from PSK or SRP auth */ char saved_username[MAX_USERNAME_SIZE+1]; - bool saved_username_set; + int saved_username_size; /* Needed for TCP Fast Open (TFO), set by gnutls_transport_set_fastopen() */ tfo_st tfo; diff --git a/lib/handshake-checks.c b/lib/handshake-checks.c index f8079dae36..b07b9680cb 100644 --- a/lib/handshake-checks.c +++ b/lib/handshake-checks.c @@ -50,7 +50,7 @@ int _gnutls_check_id_for_change(gnutls_session_t session) cred_type = gnutls_auth_get_type(session); if (cred_type == GNUTLS_CRD_PSK || cred_type == GNUTLS_CRD_SRP) { const char *username = NULL; - size_t username_length; + int username_length; if (cred_type == GNUTLS_CRD_PSK) { psk_auth_info_t ai; @@ -75,15 +75,16 @@ int _gnutls_check_id_for_change(gnutls_session_t session) if (username == NULL) return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR); - if (session->internals.saved_username_set) { - if (strncmp(session->internals.saved_username, username, username_length) != 0) { + if (session->internals.saved_username_size != -1) { + if (session->internals.saved_username_size == username_length && + strncmp(session->internals.saved_username, username, username_length) != 0) { _gnutls_debug_log("Session's PSK username changed during rehandshake; aborting!\n"); return gnutls_assert_val(GNUTLS_E_SESSION_USER_ID_CHANGED); } } else { memcpy(session->internals.saved_username, username, username_length); session->internals.saved_username[username_length] = 0; - session->internals.saved_username_set = 1; + session->internals.saved_username_size = username_length; } } diff --git a/lib/state.c b/lib/state.c index d4d5254228..0e1d155442 100644 --- a/lib/state.c +++ b/lib/state.c @@ -584,6 +584,8 @@ int gnutls_init(gnutls_session_t * session, unsigned int flags) (*session)->internals.pull_func = system_read; (*session)->internals.errno_func = system_errno; + (*session)->internals.saved_username_size = -1; + /* heartbeat timeouts */ (*session)->internals.hb_retrans_timeout_ms = 1000; (*session)->internals.hb_total_timeout_ms = 60000; |