summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaiki Ueno <dueno@redhat.com>2019-04-19 16:59:31 +0200
committerDaiki Ueno <dueno@redhat.com>2019-04-19 16:59:31 +0200
commit9b8c9835e3767e64383f935ead50cc743acc9569 (patch)
treed8bf27c90802906162f52f3accbb69568420a4fa
parent54690004aea7fd6bc07aeee919ab0848bf4549e6 (diff)
downloadgnutls-tmp-early-exporter.tar.gz
tls13/session_ticket: avoid UB regarding 64-bit time encodingtmp-early-exporter
On 32-bit platform, struct timespec.tv_sec can be signed 32-bit and thus right shifting 32 could be an undefined behavior. Signed-off-by: Daiki Ueno <dueno@redhat.com>
-rw-r--r--lib/tls13/session_ticket.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/lib/tls13/session_ticket.c b/lib/tls13/session_ticket.c
index b8371c5005..f0c4a0378a 100644
--- a/lib/tls13/session_ticket.c
+++ b/lib/tls13/session_ticket.c
@@ -79,7 +79,7 @@ pack_ticket(gnutls_session_t session, tls13_ticket_st *ticket, gnutls_datum_t *p
memcpy(p, state.data, state.size);
p += state.size;
- _gnutls_write_uint32(ticket->creation_time.tv_sec >> 32, p);
+ _gnutls_write_uint32((uint64_t) ticket->creation_time.tv_sec >> 32, p);
p += 4;
_gnutls_write_uint32(ticket->creation_time.tv_sec & 0xFFFFFFFF, p);
p += 4;
@@ -106,6 +106,7 @@ unpack_ticket(gnutls_session_t session, gnutls_datum_t *packed, tls13_ticket_st
const mac_entry_st *prf;
uint8_t *p;
ssize_t len;
+ uint64_t v;
int ret;
if (unlikely(packed == NULL || data == NULL))
@@ -168,10 +169,9 @@ unpack_ticket(gnutls_session_t session, gnutls_datum_t *packed, tls13_ticket_st
p += state.size;
DECR_LEN(len, 12);
- creation_time.tv_sec = _gnutls_read_uint32(p);
+ v = _gnutls_read_uint32(p);
p += 4;
- creation_time.tv_sec <<= 32;
- creation_time.tv_sec |= _gnutls_read_uint32(p);
+ creation_time.tv_sec = (v << 32) | _gnutls_read_uint32(p);
p += 4;
creation_time.tv_nsec = _gnutls_read_uint32(p);