• Hangyu Hua's avatar
    xfrm: xfrm_policy: fix a possible double xfrm_pols_put() in xfrm_bundle_lookup() · f85daf0e
    Hangyu Hua authored
    xfrm_policy_lookup() will call xfrm_pol_hold_rcu() to get a refcount of
    pols[0]. This refcount can be dropped in xfrm_expand_policies() when
    xfrm_expand_policies() return error. pols[0]'s refcount is balanced in
    here. But xfrm_bundle_lookup() will also call xfrm_pols_put() with
    num_pols == 1 to drop this refcount when xfrm_expand_policies() return
    error.
    
    This patch also fix an illegal address access. pols[0] will save a error
    point when xfrm_policy_lookup fails. This lead to xfrm_pols_put to resolve
    an illegal address in xfrm_bundle_lookup's error path.
    
    Fix these by setting num_pols = 0 in xfrm_expand_policies()'s error path.
    
    Fixes: 80c802f3 ("xfrm: cache bundles instead of policies for outgoing flows")
    Signed-off-by: default avatarHangyu Hua <hbh25y@gmail.com>
    Signed-off-by: default avatarSteffen Klassert <steffen.klassert@secunet.com>
    f85daf0e
xfrm_policy.c 106 KB