• J. Bruce Fields's avatar
    svcrpc: fix double-free on shutdown of nfsd after changing pool mode · da27d545
    J. Bruce Fields authored
    commit 61c8504c upstream.
    
    The pool_to and to_pool fields of the global svc_pool_map are freed on
    shutdown, but are initialized in nfsd startup only in the
    SVC_POOL_PERCPU and SVC_POOL_PERNODE cases.
    
    They *are* initialized to zero on kernel startup.  So as long as you use
    only SVC_POOL_GLOBAL (the default), this will never be a problem.
    
    You're also OK if you only ever use SVC_POOL_PERCPU or SVC_POOL_PERNODE.
    
    However, the following sequence events leads to a double-free:
    
    	1. set SVC_POOL_PERCPU or SVC_POOL_PERNODE
    	2. start nfsd: both fields are initialized.
    	3. shutdown nfsd: both fields are freed.
    	4. set SVC_POOL_GLOBAL
    	5. start nfsd: the fields are left untouched.
    	6. shutdown nfsd: now we try to free them again.
    
    Step 4 is actually unnecessary, since (for some bizarre reason), nfsd
    automatically resets the pool mode to SVC_POOL_GLOBAL on shutdown.
    Signed-off-by: default avatarJ. Bruce Fields <bfields@redhat.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
    da27d545
svc.c 30.6 KB