[lttng-dev] [PATCH lttng-tools] Fix: nsec diff can be negative leading to expeditive connection timeout

Simon Marchi simon.marchi at polymtl.ca
Thu Nov 8 17:17:22 EST 2018


On 2018-11-08 17:08, Jonathan Rajotte wrote:
> The nanoseconds part of the timespec struct time_a is not always
> bigger than time_b since it wrap around each seconds.
> 
> Use the absolute value of the nanosecond difference to perform
> unsigned long operation.
> 
> Signed-off-by: Jonathan Rajotte <jonathan.rajotte-julien at efficios.com>
> ---
>  src/common/sessiond-comm/inet.c  | 2 +-
>  src/common/sessiond-comm/inet6.c | 2 +-
>  2 files changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/src/common/sessiond-comm/inet.c 
> b/src/common/sessiond-comm/inet.c
> index e0b3e7a96..cb6f45357 100644
> --- a/src/common/sessiond-comm/inet.c
> +++ b/src/common/sessiond-comm/inet.c
> @@ -124,7 +124,7 @@ unsigned long time_diff_ms(struct timespec *time_a,
>  	unsigned long result_ms;
> 
>  	sec_diff = time_a->tv_sec - time_b->tv_sec;
> -	nsec_diff = time_a->tv_nsec - time_b->tv_nsec;
> +	nsec_diff = labs(time_a->tv_nsec - time_b->tv_nsec);
> 
>  	result_ms = sec_diff * MSEC_PER_SEC;
>  	result_ms += nsec_diff / NSEC_PER_MSEC;
> diff --git a/src/common/sessiond-comm/inet6.c 
> b/src/common/sessiond-comm/inet6.c
> index dfb5fc5d1..b73802d48 100644
> --- a/src/common/sessiond-comm/inet6.c
> +++ b/src/common/sessiond-comm/inet6.c
> @@ -122,7 +122,7 @@ unsigned long time_diff_ms(struct timespec *time_a,
>  	unsigned long result_ms;
> 
>  	sec_diff = time_a->tv_sec - time_b->tv_sec;
> -	nsec_diff = time_a->tv_nsec - time_b->tv_nsec;
> +	nsec_diff = labs(time_a->tv_nsec - time_b->tv_nsec);
> 
>  	result_ms = sec_diff * MSEC_PER_SEC;
>  	result_ms += nsec_diff / NSEC_PER_MSEC;

That doesn't look right either.  With

time_a = 2.9 s
time_b = 3.1 s

it will result in

sec_diff = 1 s
nsec_diff = 0.8 s

Added, the result will be 1.8 seconds, when actually we expect 0.2 s.  
You probably have no choice but do the "borrowing" by hand, like we did 
when learning subtraction in elementary school :).  Maybe this deserves 
some unit tests, since it's apparently easy to get it wrong.

Simon


More information about the lttng-dev mailing list