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:
parent
6bf0f408e4
commit
04a1d84cef
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user