1
1
mirror of https://github.com/systemd/systemd-stable.git synced 2024-10-27 01:55:32 +03:00

util-lib: make sure usec_sub() doesn't degrade USEC_INFINITY

As suggested in: https://github.com/systemd/systemd/pull/2542#issuecomment-181877820
This commit is contained in:
Lennart Poettering 2016-02-09 19:55:04 +01:00
parent 6bf0f408e4
commit 04a1d84cef
2 changed files with 21 additions and 6 deletions

View File

@ -143,11 +143,13 @@ static inline usec_t usec_add(usec_t a, usec_t b) {
static inline usec_t usec_sub(usec_t timestamp, int64_t delta) {
if (delta < 0)
timestamp = usec_add(timestamp, (usec_t) (-delta));
else if (timestamp > (usec_t) delta)
timestamp -= delta;
else
timestamp = 0;
return usec_add(timestamp, (usec_t) (-delta));
return timestamp;
if (timestamp == USEC_INFINITY) /* Make sure infinity doesn't degrade */
return USEC_INFINITY;
if (timestamp < (usec_t) delta)
return 0;
return timestamp - delta;
}

View File

@ -191,6 +191,18 @@ static void test_usec_add(void) {
assert_se(usec_add(USEC_INFINITY, 2) == USEC_INFINITY);
}
static void test_usec_sub(void) {
assert_se(usec_sub(0, 0) == 0);
assert_se(usec_sub(4, 1) == 3);
assert_se(usec_sub(4, 4) == 0);
assert_se(usec_sub(4, 5) == 0);
assert_se(usec_sub(USEC_INFINITY-3, -3) == USEC_INFINITY);
assert_se(usec_sub(USEC_INFINITY-3, -3) == USEC_INFINITY);
assert_se(usec_sub(USEC_INFINITY-3, -4) == USEC_INFINITY);
assert_se(usec_sub(USEC_INFINITY-3, -5) == USEC_INFINITY);
assert_se(usec_sub(USEC_INFINITY, 5) == USEC_INFINITY);
}
int main(int argc, char *argv[]) {
uintmax_t x;
@ -203,6 +215,7 @@ int main(int argc, char *argv[]) {
test_timezone_is_valid();
test_get_timezones();
test_usec_add();
test_usec_sub();
/* Ensure time_t is signed */
assert_cc((time_t) -1 < (time_t) 1);