[PATCH rtems-libbsd 1/7] rtemsbsd: Catch timeout overflows

Chris Johns chrisj at rtems.org
Tue Jul 27 22:53:23 UTC 2021


On 28/7/21 7:38 am, Gedare Bloom wrote:
> On Tue, Jul 27, 2021 at 2:59 AM <chrisj at rtems.org> wrote:
>>
>> From: Chris Johns <chrisj at rtems.org>
>>
>> Update #4475
> This change could probably use its own ticket.

Without the change the RPC client fails to connect in a reliable way because the
connection may time out for no real reason. A connection that is stable appears
fragile. I used this ticket because the change was needed for NFS to work.

https://github.com/freebsd/freebsd-src/blob/main/sys/rpc/clnt_dg.c#L388

>> ---
>>  rtemsbsd/rtems/rtems-kernel-timesupport.c | 8 +++++++-
>>  1 file changed, 7 insertions(+), 1 deletion(-)
>>
>> diff --git a/rtemsbsd/rtems/rtems-kernel-timesupport.c b/rtemsbsd/rtems/rtems-kernel-timesupport.c
>> index ef14d1fa..5d290d66 100644
>> --- a/rtemsbsd/rtems/rtems-kernel-timesupport.c
>> +++ b/rtemsbsd/rtems/rtems-kernel-timesupport.c
>> @@ -35,6 +35,7 @@
>>
>>  #include <machine/rtems-bsd-kernel-space.h>
>>
>> +#include <limits.h>
>>  #include <sys/time.h>
>>
>>  #include <rtems/score/timespec.h>
>> @@ -46,9 +47,14 @@ int
>>  tvtohz(struct timeval *tv)
>>  {
>>    struct timespec ts;
>> +  uint32_t ticks;
>>
>>    ts.tv_sec = tv->tv_sec;
>>    ts.tv_nsec = tv->tv_usec * 1000;
>>
>> -  return (int) _Timespec_To_ticks( &ts );
>> +  ticks = _Timespec_To_ticks( &ts );
>> +  if (ticks > INT_MAX)
>> +    ticks = INT_MAX;
>> +
> This changes the behavior to saturating in the overflow case, which is
> at least well-defined, but is it the best thing to do?  (I have no
> idea.)

I do not have a better suggestion? The user is providing a timeval that exceeds
the size of the return value so providing the max value at least the gets you
closer to the actual value than any other value?

Chris


More information about the devel mailing list