# HG changeset patch # User Chris Cannam # Date 1512984477 0 # Node ID 8ede825a54f686380ffb9ab3054fcabaab409e67 # Parent a87e1bcce7b0714799a2709591f83a201937d0f6 Rework canonicalisation so as to avoid theoretical possibility of integer overflow. (This is unit tested in svcore, not here - tests pass) diff -r a87e1bcce7b0 -r 8ede825a54f6 src/vamp-sdk/RealTime.cpp --- a/src/vamp-sdk/RealTime.cpp Tue Oct 10 13:53:48 2017 +0100 +++ b/src/vamp-sdk/RealTime.cpp Mon Dec 11 09:27:57 2017 +0000 @@ -42,6 +42,7 @@ */ #include +#include #if (defined(__GNUC__)) && (__GNUC__ < 3) #include @@ -77,16 +78,10 @@ RealTime::RealTime(int s, int n) : sec(s), nsec(n) { - if (sec == 0) { - while (nsec <= -ONE_BILLION) { nsec += ONE_BILLION; --sec; } - while (nsec >= ONE_BILLION) { nsec -= ONE_BILLION; ++sec; } - } else if (sec < 0) { - while (nsec <= -ONE_BILLION) { nsec += ONE_BILLION; --sec; } - while (nsec > 0 && sec < 0) { nsec -= ONE_BILLION; ++sec; } - } else { - while (nsec >= ONE_BILLION) { nsec -= ONE_BILLION; ++sec; } - while (nsec < 0 && sec > 0) { nsec += ONE_BILLION; --sec; } - } + while (nsec <= -ONE_BILLION && sec > INT_MIN) { nsec += ONE_BILLION; --sec; } + while (nsec >= ONE_BILLION && sec < INT_MAX) { nsec -= ONE_BILLION; ++sec; } + while (nsec > 0 && sec < 0) { nsec -= ONE_BILLION; ++sec; } + while (nsec < 0 && sec > 0) { nsec += ONE_BILLION; --sec; } } RealTime