summaryrefslogtreecommitdiffstats
path: root/tests/xtime.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/xtime.c')
-rw-r--r--tests/xtime.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/tests/xtime.c b/tests/xtime.c
index 2609c1c..3f1fec2 100644
--- a/tests/xtime.c
+++ b/tests/xtime.c
@@ -99,6 +99,19 @@ static bool check_xmktime(void) {
ret &= check_one_xmktime(time);
}
+ // Attempt to trigger overflow (but don't test for it, since it's not mandatory)
+ struct tm tm = {
+ .tm_year = INT_MAX,
+ .tm_mon = INT_MAX,
+ .tm_mday = INT_MAX,
+ .tm_hour = INT_MAX,
+ .tm_min = INT_MAX,
+ .tm_sec = INT_MAX,
+ .tm_isdst = -1,
+ };
+ time_t time;
+ xmktime(&tm, &time);
+
return ret;
}
@@ -131,7 +144,9 @@ static bool check_xtimegm(void) {
struct tm tm = {
.tm_isdst = -1,
};
+ time_t time;
+ // Check equivalence with mktime()
for (tm.tm_year = 10; tm.tm_year <= 200; tm.tm_year += 10)
for (tm.tm_mon = -3; tm.tm_mon <= 15; tm.tm_mon += 3)
for (tm.tm_mday = -31; tm.tm_mday <= 61; tm.tm_mday += 4)
@@ -141,6 +156,19 @@ static bool check_xtimegm(void) {
ret &= check_one_xtimegm(&tm);
}
+ // Check integer overflow cases
+ tm = (struct tm){ .tm_sec = INT_MAX, .tm_min = INT_MAX };
+ ret &= bfs_check(xtimegm(&tm, &time) == -1 && errno == EOVERFLOW);
+
+ tm = (struct tm){ .tm_min = INT_MAX, .tm_hour = INT_MAX };
+ ret &= bfs_check(xtimegm(&tm, &time) == -1 && errno == EOVERFLOW);
+
+ tm = (struct tm){ .tm_hour = INT_MAX, .tm_mday = INT_MAX };
+ ret &= bfs_check(xtimegm(&tm, &time) == -1 && errno == EOVERFLOW);
+
+ tm = (struct tm){ .tm_mon = INT_MAX, .tm_year = INT_MAX };
+ ret &= bfs_check(xtimegm(&tm, &time) == -1 && errno == EOVERFLOW);
+
return ret;
}