[PATCH v6 2/5] linux: Use long time_t __getitimer/__setitimer
Alistair Francis
alistair23@gmail.com
Mon Mar 30 16:27:49 GMT 2020
On Mon, Mar 30, 2020 at 9:34 AM Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:
>
>
>
> On 30/03/2020 13:17, Alistair Francis wrote:
> > On Mon, Mar 30, 2020 at 7:49 AM Adhemerval Zanella via Libc-alpha
> > <libc-alpha@sourceware.org> wrote:
> >>
> >>
> >>
> >> On 29/03/2020 19:19, Stepan Golosunov wrote:
> >>> 29.03.2020 в 11:17:17 -0700 Alistair Francis написал:
> >>>> On Sun, Mar 29, 2020 at 2:59 AM Stepan Golosunov <stepan@golosunov.pp.ru> wrote:
> >>>>>
> >>>>> 28.03.2020 в 08:22:46 -0700 Alistair Francis написал:
> >>>>>> --- /dev/null
> >>>>>> +++ b/sysdeps/unix/sysv/linux/getitimer.c
> >>>>>
> >>>>>> +int
> >>>>>> +__getitimer64 (__itimer_which_t which, struct __itimerval64 *curr_value)
> >>>>>> +{
> >>>>>> +#if __KERNEL_OLD_TIMEVAL_MATCHES_TIMEVAL64
> >>>>>> + return INLINE_SYSCALL_CALL (getitimer, which, curr_value);
> >>>>>> +#else
> >>>>>> + struct __itimerval32 curr_value_32;
> >>>>>> +
> >>>>>> + if (INLINE_SYSCALL_CALL (getitimer, which, &curr_value_32) == -1)
> >>>>>> + return -1;
> >>>>>> +
> >>>>>> + curr_value->it_interval
> >>>>>> + = valid_timeval32_to_timeval64 (curr_value_32.it_interval);
> >>>>>> + curr_value->it_value
> >>>>>> + = valid_timeval32_to_timeval64 (curr_value_32.it_value);
> >>>>>> + return 0;
> >>>>>> +#endif
> >>>>>> +}
> >>>>>> +
> >>>>>> +#if __TIMESIZE != 64
> >>>>>> +libc_hidden_def (__getitimer64)
> >>>>>> +int
> >>>>>> +__getitimer (__itimer_which_t which, struct itimerval *curr_value)
> >>>>>> +{
> >>>>>> + struct __itimerval64 val64;
> >>>>>> +
> >>>>>> + val64.it_interval
> >>>>>> + = valid_timeval_to_timeval64 (curr_value->it_interval);
> >>>>>> + val64.it_value
> >>>>>> + = valid_timeval_to_timeval64 (curr_value->it_value);
> >>>>>> +
> >>>>>> + return __getitimer64 (which, &val64);
> >>>>>> +}
> >>>>>> +#endif
> >>>>>> +weak_alias (__getitimer, getitimer)
> >>>>>
> >>>>> __getitimer treats curr_value as input-only variable, while it's an
> >>>>> output-only one in __getitimer64. This won't work.
> >>>>
> >>>> I'm not sure what you mean here, can you please elaborate?
> >>>
> >>> __getitimer (…, &curr_value) will never write to curr_value (or do
> >>> anything useful with it at all); while
> >>> __getitimer64 (…, &curr_value) will write to curr_value as expected.
> >>>
> >>> Conversion in __getitimer shold be in opposite direction and after
> >>> __getitimer64 call.
> >>>
> >>
> >> Indeed, it should be:
> >>
> >> int
> >> __getitimer64 (__itimer_which_t which, struct __itimerval64 *curr_value)
> >> {
> >> [...]
> >> }
> >>
> >> #if __TIMESIZE != 64
> >> libc_hidden_def (__getitimer64)
> >>
> >> int
> >> __getitimer (__itimer_which_t which, struct itimerval *curr_value)
> >> {
> >> struct __itimerval64 val64;
> >> if (__getitimer64 (which, &val64) != 0)
> >> return -1;
> >>
> >> curr_value->it_interval
> >> = valid_timeval64_to_timeval (val64->it_interval);
> >> curr_value->it_value
> >> = valid_timeval64_to_timeval (val64->it_value);
> >>
> >> return 0;
> >> }
> >> #endif
> >
> > I changed it to this (which is very similar to above). Good catch on that.
> >
> > #if __TIMESIZE != 64
> > libc_hidden_def (__getitimer64)
> > int
> > __getitimer (__itimer_which_t which, struct itimerval *curr_value)
> > {
> > struct __itimerval64 val64;
> > int ret = __getitimer64 (which, &val64);
>
> There is no need to actually check the return value, POSIX states it
> return -1 on failure (and __getitimer64 will set errno accordingly).
>
> >
> > if (ret == 0 && curr_value)
>
> Again there is no need to check if 'curr_value', neither POSIX or
> kernels add such constraints (and kernel does return EFAULT in
> such case).
We don't pass curr_value to the kernel, so this will just segfault if
curr_value is invalid.
I will remove the check though.
Alistair
>
> > {
> > curr_value->it_interval
> > = valid_timeval64_to_timeval (val64.it_interval);
> > curr_value->it_value
> > = valid_timeval64_to_timeval (val64.it_value);
> > }
> >
> > return ret;
>
More information about the Libc-alpha
mailing list