pcan_add_channels() stores a registered net_device at card->channel[i], where i is the hardware channel index, but only increments card->chan_count by one. When a lower channel is absent or fails to register and a higher one succeeds, chan_count no longer covers the used slot. pcan_free_channels() then iterates only up to chan_count and leaks the net_device of the higher channel; the LED timer and the interrupt handler also skip it. Record the highest used channel index plus one in chan_count so that every iterator covers all channel slots. Fixes: 2b61972b7421 ("can: sja1000: add support for PEAK-System PCMCIA card") Cc: stable@vger.kernel.org Assisted-by: DeepSeek-V4.1-Flash and OpenAI Codex Signed-off-by: Wentao Liang --- drivers/net/can/sja1000/peak_pcmcia.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/can/sja1000/peak_pcmcia.c b/drivers/net/can/sja1000/peak_pcmcia.c index c3c2aa21da47..bba51dd808f8 100644 --- a/drivers/net/can/sja1000/peak_pcmcia.c +++ b/drivers/net/can/sja1000/peak_pcmcia.c @@ -574,7 +574,7 @@ static int pcan_add_channels(struct pcan_pccard *card) } card->channel[i].netdev = netdev; - card->chan_count++; + card->chan_count = i + 1; /* set corresponding led on in the new ccr */ ccr &= ~PCC_CCR_LED_OFF_CHAN(i); -- 2.34.1