]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ice: dpll: set pointers to NULL after kfree in ice_dpll_deinit_info
authorZhaoJinming <zhaojinming@uniontech.com>
Fri, 29 May 2026 05:37:32 +0000 (13:37 +0800)
committerTony Nguyen <anthony.l.nguyen@intel.com>
Mon, 22 Jun 2026 21:44:50 +0000 (14:44 -0700)
ice_dpll_deinit_info() calls kfree() on several pf->dplls fields
(inputs, outputs, eec.input_prio, pps.input_prio) but does not set
the pointers to NULL afterward. This leaves dangling pointers in the
pf->dplls structure.

While not currently exploitable through existing code paths, this is
unsafe because:

1. If ice_dpll_init_info() is called again after a deinit (e.g. during
   driver recovery), and a subsequent allocation within init fails, the
   error path will jump to deinit_info and call ice_dpll_deinit_info()
   again. Since some pointers still hold the old freed addresses, this
   would result in a double-free.

2. Any future code that checks these pointers before use or after free
   would be unprotected against use-after-free.

Follow the common kernel convention of setting pointers to NULL after
kfree() so that:
- kfree(NULL) is a safe no-op, preventing double-free
- NULL checks on these pointers become meaningful

This is a preparatory fix for a subsequent patch that routes additional
error paths in ice_dpll_init_info() to the deinit_info label.

Fixes: d7999f5ea64b ("ice: implement dpll interface to control cgu")
Signed-off-by: ZhaoJinming <zhaojinming@uniontech.com>
Reviewed-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com>
Tested-by: Rinitha S <sx.rinitha@intel.com> (A Contingent worker at Intel)
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
drivers/net/ethernet/intel/ice/ice_dpll.c

index 462c69cc11e19d2ee1870cca3c65cf75ce92efcc..3876ee7255ac2d44103c42d45359d7376ab2bc09 100644 (file)
@@ -4645,9 +4645,13 @@ ice_dpll_init_pins_info(struct ice_pf *pf, enum ice_dpll_pin_type pin_type)
 static void ice_dpll_deinit_info(struct ice_pf *pf)
 {
        kfree(pf->dplls.inputs);
+       pf->dplls.inputs = NULL;
        kfree(pf->dplls.outputs);
+       pf->dplls.outputs = NULL;
        kfree(pf->dplls.eec.input_prio);
+       pf->dplls.eec.input_prio = NULL;
        kfree(pf->dplls.pps.input_prio);
+       pf->dplls.pps.input_prio = NULL;
 }
 
 /**