[all-commits] [llvm/llvm-project] 80225a: [libc] Fix overflow check for 32 bit long time_t (...

Mikhail R. Gadelha via All-commits all-commits at lists.llvm.org
Thu Sep 7 06:18:37 PDT 2023


  Branch: refs/heads/main
  Home:   https://github.com/llvm/llvm-project
  Commit: 80225af4c1445c7818c6a71121d83bcc8ed7dd3b
      https://github.com/llvm/llvm-project/commit/80225af4c1445c7818c6a71121d83bcc8ed7dd3b
  Author: Mikhail R. Gadelha <mikhail at igalia.com>
  Date:   2023-09-07 (Thu, 07 Sep 2023)

  Changed paths:
    M libc/src/time/mktime.cpp
    M libc/src/time/time_utils.cpp
    M libc/src/time/time_utils.h

  Log Message:
  -----------
  [libc] Fix overflow check for 32 bit long time_t (#65394)

This patch fixes the overflow check in update_from_seconds, used by
gmtime, gmtime_r and mktime.

In update_from_seconds, total_seconds is a int64_t and the previous
overflow check for when sizeof(time_t) == 4 would check if it was <
0x80000000 and > 0x7FFFFFFF, however, this check would cause the
following issues:

1. Valid negative numbers would be discarded, e.g., -1 is
0xffffffffffffffff as a int64_t, outside the range of the overflow
check.

2. Some valid positive numbers would be discarded because the hex
constants were being implicitly converted to int64_t, e.g., 0x80000000
would be implicitly converted to 2147483648, instead of -2147483648.

The fix for both cases was to static_cast total_seconds and the
constants to time_t if sizeof(time_t) == 4. The behaviour is not changed
in systems with sizeof(time_t) == 8.

---------

Signed-off-by: Mikhail R. Gadelha <mikhail at igalia.com>




More information about the All-commits mailing list