diff options
author | Daiki Ueno <dueno@redhat.com> | 2019-04-19 16:59:31 +0200 |
---|---|---|
committer | Daiki Ueno <dueno@redhat.com> | 2019-04-19 16:59:31 +0200 |
commit | 9b8c9835e3767e64383f935ead50cc743acc9569 (patch) | |
tree | d8bf27c90802906162f52f3accbb69568420a4fa /lib | |
parent | 54690004aea7fd6bc07aeee919ab0848bf4549e6 (diff) | |
download | gnutls-9b8c9835e3767e64383f935ead50cc743acc9569.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>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/tls13/session_ticket.c | 8 |
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); |