summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@gnutls.org>2020-03-18 11:23:47 +0100
committerAnder Juaristi <a@juaristi.eus>2020-03-23 17:00:58 +0100
commitded59e682aeef30c7ae172cc22700f8f92faeb76 (patch)
tree3a704af0b0c44bf99d4b204ab34c1f9017cb6d78
parent7e43ed8acceb84f140ed090195b3100d80f3ccc2 (diff)
downloadgnutls-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.h2
-rw-r--r--lib/handshake-checks.c9
-rw-r--r--lib/state.c2
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;