[PATCH 3/3] staging: media: av7110: check dvb_net_init() result in av7110_register()

From: Andrey Karelin

Date: Mon Nov 02 2026 - 07:53:29 EST


av7110_register() ignores the return value of dvb_net_init() for both
dvb_net and the optional budget-patch dvb_net1. dvb_net_init() fails if
the net device cannot be registered and leaves dvbnet->dvbdev NULL.
Probing then continues, and on device removal dvb_unregister() calls
dvb_net_release(), which dereferences dvbnet->dvbdev.

Check the result and unwind on failure.

Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
Cc: stable@xxxxxxxxxxxxxxx
Signed-off-by: Andrey Karelin <a.karelin@xxxxxxxx>
---
drivers/staging/media/av7110/av7110.c | 16 ++++++++++++----
1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/drivers/staging/media/av7110/av7110.c b/drivers/staging/media/av7110/av7110.c
index 3371e33db103..9390c347da50 100644
--- a/drivers/staging/media/av7110/av7110.c
+++ b/drivers/staging/media/av7110/av7110.c
@@ -1314,7 +1314,9 @@ static int av7110_register(struct av7110 *av7110)
&dvbdev_osd, av7110, DVB_DEVICE_OSD, 0);
#endif

- dvb_net_init(&av7110->dvb_adapter, &av7110->dvb_net, &dvbdemux->dmx);
+ ret = dvb_net_init(&av7110->dvb_adapter, &av7110->dvb_net, &dvbdemux->dmx);
+ if (ret < 0)
+ goto err_unregister_devices;

if (budgetpatch) {
/* initialize software demux1 without its own frontend
@@ -1333,7 +1335,7 @@ static int av7110_register(struct av7110 *av7110)

ret = dvb_dmx_init(&av7110->demux1);
if (ret < 0)
- goto err_unregister;
+ goto err_net_release;

av7110->dmxdev1.filternum = 256;
av7110->dmxdev1.demux = &dvbdemux1->dmx;
@@ -1343,15 +1345,21 @@ static int av7110_register(struct av7110 *av7110)
if (ret < 0)
goto err_dmx1_release;

- dvb_net_init(&av7110->dvb_adapter, &av7110->dvb_net1, &dvbdemux1->dmx);
+ ret = dvb_net_init(&av7110->dvb_adapter, &av7110->dvb_net1,
+ &dvbdemux1->dmx);
+ if (ret < 0)
+ goto err_dmxdev1_release;
pr_info("additional demux1 for budget-patch registered\n");
}
return 0;

+err_dmxdev1_release:
+ dvb_dmxdev_release(&av7110->dmxdev1);
err_dmx1_release:
dvb_dmx_release(&av7110->demux1);
-err_unregister:
+err_net_release:
dvb_net_release(&av7110->dvb_net);
+err_unregister_devices:
dvb_unregister_device(av7110->osd_dev);
av7110_ca_unregister(av7110);
av7110_av_unregister(av7110);
--
2.56.0