Skip to content

Commit

Permalink
rtc: Use time_t for passing and returning time offsets
Browse files Browse the repository at this point in the history
The functions qemu_get_timedate() and qemu_timedate_diff() take
and return a time offset as an integer. Coverity points out that
means that when an RTC device implementation holds an offset
as a time_t, as the m48t59 does, the time_t will get truncated.
(CID 1507157, 1517772).

The functions work with time_t internally, so make them use that type
in their APIs.

Note that this won't help any Y2038 issues where either the device
model itself is keeping the offset in a 32-bit integer, or where the
hardware under emulation has Y2038 or other rollover problems.  If we
missed any cases of the former then hopefully Coverity will warn us
about them since after this patch we'd be truncating a time_t in
assignments from qemu_timedate_diff().)

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
  • Loading branch information
pm215 committed Aug 31, 2023
1 parent c0a6385 commit 5ec008a
Show file tree
Hide file tree
Showing 2 changed files with 4 additions and 4 deletions.
4 changes: 2 additions & 2 deletions include/sysemu/rtc.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@
* The behaviour of the clock whose value this function returns will
* depend on the -rtc command line option passed by the user.
*/
void qemu_get_timedate(struct tm *tm, int offset);
void qemu_get_timedate(struct tm *tm, time_t offset);

/**
* qemu_timedate_diff: Return difference between a struct tm and the RTC
Expand All @@ -53,6 +53,6 @@ void qemu_get_timedate(struct tm *tm, int offset);
* a timestamp one hour further ahead than the current RTC time
* then this function will return 3600.
*/
int qemu_timedate_diff(struct tm *tm);
time_t qemu_timedate_diff(struct tm *tm);

#endif
4 changes: 2 additions & 2 deletions softmmu/rtc.c
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ static time_t qemu_ref_timedate(QEMUClockType clock)
return value;
}

void qemu_get_timedate(struct tm *tm, int offset)
void qemu_get_timedate(struct tm *tm, time_t offset)
{
time_t ti = qemu_ref_timedate(rtc_clock);

Expand All @@ -85,7 +85,7 @@ void qemu_get_timedate(struct tm *tm, int offset)
}
}

int qemu_timedate_diff(struct tm *tm)
time_t qemu_timedate_diff(struct tm *tm)
{
time_t seconds;

Expand Down

0 comments on commit 5ec008a

Please sign in to comment.