• Michael Pratt's avatar
    posix-cpu-timers: Clear task::posix_cputimers_work in copy_process() · ca7752ca
    Michael Pratt authored
    copy_process currently copies task_struct.posix_cputimers_work as-is. If a
    timer interrupt arrives while handling clone and before dup_task_struct
    completes then the child task will have:
    
    1. posix_cputimers_work.scheduled = true
    2. posix_cputimers_work.work queued.
    
    copy_process clears task_struct.task_works, so (2) will have no effect and
    posix_cpu_timers_work will never run (not to mention it doesn't make sense
    for two tasks to share a common linked list).
    
    Since posix_cpu_timers_work never runs, posix_cputimers_work.scheduled is
    never cleared. Since scheduled is set, future timer interrupts will skip
    scheduling work, with the ultimate result that the task will never receive
    timer expirations.
    
    Together, the complete flow is:
    
    1. Task 1 calls clone(), enters kernel.
    2. Timer interrupt fires, schedules task work on Task 1.
       2a. task_struct.posix_cputimers_work.scheduled = true
       2b. task_struct.posix_cputimers_work.work added to
           task_struct.task_works.
    3. dup_task_struct() copies Task 1 to Task 2.
    4. copy_process() clears task_struct.task_works for Task 2.
    5. Future timer interrupts on Task 2 see
       task_struct.posix_cputimers_work.scheduled = true and skip scheduling
       work.
    
    Fix this by explicitly clearing contents of task_struct.posix_cputimers_work
    in copy_process(). This was never meant to be shared or inherited across
    tasks in the first place.
    
    Fixes: 1fb497dd ("posix-cpu-timers: Provide mechanisms to defer timer handling to task_work")
    Reported-by: default avatarRhys Hiltner <rhys@justin.tv>
    Signed-off-by: default avatarMichael Pratt <mpratt@google.com>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20211101210615.716522-1-mpratt@google.com
    ca7752ca
posix-cpu-timers.c 44.4 KB