Skip to content

Conversation

mikhailramalho
Copy link
Member

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.

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@igalia.com>
@mikhailramalho mikhailramalho force-pushed the libc-overflow-check-time_t branch from 8f80f0f to 8a137df Compare September 6, 2023 22:02
@mikhailramalho mikhailramalho merged commit 80225af into llvm:main Sep 7, 2023
@mikhailramalho mikhailramalho deleted the libc-overflow-check-time_t branch September 7, 2023 13:18
avillega pushed a commit to avillega/llvm-project that referenced this pull request Sep 11, 2023
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@igalia.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants