Le 25/07/2022 à 13:00, Peter Maydell a écrit :
For handling guest POSIX timers, we currently use an array
g_posix_timers[], whose entries are a host timer_t value, or 0 for
"this slot is unused".  When the guest calls the timer_create syscall
we look through the array for a slot containing 0, and use that for
the new timer.

This scheme assumes that host timer_t values can never be zero.  This
is unfortunately not a valid assumption -- for some host libc
versions, timer_t values are simply indexes starting at 0.  When
using this kind of host libc, the effect is that the first and second
timers end up sharing a slot, and so when the guest tries to operate
on the first timer it changes the second timer instead.

Rework the timer allocation code, so that:
  * the 'slot in use' indication uses a separate array from the
    host timer_t array
  * we grab the free slot atomically, to avoid races when multiple
    threads call timer_create simultaneously
  * releasing an allocated slot is abstracted out into a new
    free_host_timer_slot() function called in the correct places

This fixes:
  * problems on hosts where timer_t 0 is valid
  * the FIXME in next_free_host_timer() about locking
  * bugs in the error paths in timer_create where we forgot to release
    the slot we grabbed, or forgot to free the host timer

Reported-by: Jon Alduan <[email protected]>
Signed-off-by: Peter Maydell <[email protected]>
---
  linux-user/syscall.c | 24 ++++++++++++++++--------
  1 file changed, 16 insertions(+), 8 deletions(-)


Applied to my linux-user-for-7.2 branch.

Thanks,
Laurent


Reply via email to