Skip to content
GitLab
Projects Groups Topics Snippets
  • /
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
  • Register
  • Sign in
  • L linux
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributor statistics
    • Graph
    • Compare revisions
  • Issues 0
    • Issues 0
    • List
    • Boards
    • Service Desk
    • Milestones
  • Merge requests 0
    • Merge requests 0
  • Deployments
    • Deployments
    • Releases
  • Monitor
    • Monitor
    • Incidents
  • Analytics
    • Analytics
    • Value stream
    • Repository
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Commits
  • Issue Boards
Collapse sidebar
  • Kirill Smelkov
  • linux
  • Repository
You need to sign in or sign up before continuing.
  • linux
  • kernel
  • workqueue_internal.h
Find file BlameHistoryPermalink
  • Li Bin's avatar
    workqueue: Fix NULL pointer dereference · f4e9e88c
    Li Bin authored Oct 28, 2017
    BugLink: http://bugs.launchpad.net/bugs/1732698
    
    commit cef572ad
    
     upstream.
    
    When queue_work() is used in irq (not in task context), there is
    a potential case that trigger NULL pointer dereference.
    ----------------------------------------------------------------
    worker_thread()
    |-spin_lock_irq()
    |-process_one_work()
    	|-worker->current_pwq = pwq
    	|-spin_unlock_irq()
    	|-worker->current_func(work)
    	|-spin_lock_irq()
     	|-worker->current_pwq = NULL
    |-spin_unlock_irq()
    
    				//interrupt here
    				|-irq_handler
    					|-__queue_work()
    						//assuming that the wq is draining
    						|-is_chained_work(wq)
    							|-current_wq_worker()
    							//Here, 'current' is the interrupted worker!
    								|-current->current_pwq is NULL here!
    |-schedule()
    ----------------------------------------------------------------
    
    Avoid it by checking for task context in current_wq_worker(), and
    if not in task context, we shouldn't use the 'current' to check the
    condition.
    
    Reported-by: default avatarXiaofei Tan <tanxiaofei@huawei.com>
    Signed-off-by: default avatarLi Bin <huawei.libin@huawei.com>
    Reviewed-by: default avatarLai Jiangshan <jiangshanlai@gmail.com>
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Fixes: 8d03ecfe
    
     ("workqueue: reimplement is_chained_work() using current_wq_worker()")
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: default avatarStefan Bader <stefan.bader@canonical.com>
    Signed-off-by: default avatarThadeu Lima de Souza Cascardo <cascardo@canonical.com>
    f4e9e88c
GitLab Nexedi Edition | About GitLab | About Nexedi | 沪ICP备2021021310号-2 | 沪ICP备2021021310号-7