Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 31 additions & 24 deletions src/util.c
Original file line number Diff line number Diff line change
Expand Up @@ -818,40 +818,47 @@ again: switch (c = *fmt++) {
LEGAL_ALT(ALT_O);
continue;

#ifndef TIME_MAX
#define TIME_MAX INT64_MAX
case 's': { /* seconds since the epoch */
#ifdef _WIN32
const time_t TIME_MAX = INT32_MAX;
#else
const time_t TIME_MAX = INT64_MAX;
#endif
case 's': /* seconds since the epoch */
{
time_t sse = 0;
uint64_t rulim = TIME_MAX;
time_t sse;
time_t d;

if (*bp < '0' || *bp > '9') {
bp = NULL;
continue;
}

if (*bp < '0' || *bp > '9') {
sse = *bp++ - '0';
while (*bp >= '0' && *bp <= '9') {
d = *bp++ - '0';
if (sse > TIME_MAX/10) {
bp = NULL;
continue;
break;
}

do {
sse *= 10;
sse += *bp++ - '0';
rulim /= 10;
} while ((sse * 10 <= TIME_MAX) &&
rulim && *bp >= '0' && *bp <= '9');

if (sse < 0 || (uint64_t)sse > TIME_MAX) {
sse *= 10;
if (sse > TIME_MAX - d) {
bp = NULL;
continue;
break;
}
sse += d;
}
if (bp == NULL)
continue;

#ifdef _WIN32
if (localtime_s(tm, &sse) == 0)
if (localtime_s(tm, &sse))
#else
if (localtime_r(&sse, tm))
if (localtime_r(&sse, tm) == NULL)
#endif
state |= S_YDAY | S_WDAY | S_MON | S_MDAY | S_YEAR;
else
bp = NULL;
}
bp = NULL;
else
state |= S_YDAY | S_WDAY | S_MON | S_MDAY | S_YEAR;
continue;
}

case 'U': /* The week of year, beginning on sunday. */
case 'W': /* The week of year, beginning on monday. */
Expand Down