Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[media] dvbdev: split dvb_unregister_device()

dvb_unregister_device() has a major problem: it combines unregistering
with memory disposal. Sometimes, it is necessary to unregister a
device, but no memory can be freed yet, because a process still has a
(stale) file handle. Therefore, we need to split
dvb_unregister_device(). This will allow sanitizing a few callers.

With my new design, dvb_unregister_device() appears misnamed, but to
reduce patch noise, I'm not renaming it just yet.

Signed-off-by: Max Kellermann <max.kellermann@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>

authored by

Max Kellermann and committed by
Mauro Carvalho Chehab
1f4ed6cd bd336e63

+41 -1
+18 -1
drivers/media/dvb-core/dvbdev.c
··· 528 528 EXPORT_SYMBOL(dvb_register_device); 529 529 530 530 531 - void dvb_unregister_device(struct dvb_device *dvbdev) 531 + void dvb_remove_device(struct dvb_device *dvbdev) 532 532 { 533 533 if (!dvbdev) 534 534 return; ··· 542 542 device_destroy(dvb_class, MKDEV(DVB_MAJOR, dvbdev->minor)); 543 543 544 544 list_del (&dvbdev->list_head); 545 + } 546 + EXPORT_SYMBOL(dvb_remove_device); 547 + 548 + 549 + void dvb_free_device(struct dvb_device *dvbdev) 550 + { 551 + if (!dvbdev) 552 + return; 553 + 545 554 kfree (dvbdev->fops); 546 555 kfree (dvbdev); 556 + } 557 + EXPORT_SYMBOL(dvb_free_device); 558 + 559 + 560 + void dvb_unregister_device(struct dvb_device *dvbdev) 561 + { 562 + dvb_remove_device(dvbdev); 563 + dvb_free_device(dvbdev); 547 564 } 548 565 EXPORT_SYMBOL(dvb_unregister_device); 549 566
+23
drivers/media/dvb-core/dvbdev.h
··· 212 212 int demux_sink_pads); 213 213 214 214 /** 215 + * dvb_remove_device - Remove a registered DVB device 216 + * 217 + * This does not free memory. To do that, call dvb_free_device(). 218 + * 219 + * @dvbdev: pointer to struct dvb_device 220 + */ 221 + void dvb_remove_device(struct dvb_device *dvbdev); 222 + 223 + /** 224 + * dvb_free_device - Free memory occupied by a DVB device. 225 + * 226 + * Call dvb_unregister_device() before calling this function. 227 + * 228 + * @dvbdev: pointer to struct dvb_device 229 + */ 230 + void dvb_free_device(struct dvb_device *dvbdev); 231 + 232 + /** 215 233 * dvb_unregister_device - Unregisters a DVB device 234 + * 235 + * This is a combination of dvb_remove_device() and dvb_free_device(). 236 + * Using this function is usually a mistake, and is often an indicator 237 + * for a use-after-free bug (when a userspace process keeps a file 238 + * handle to a detached device). 216 239 * 217 240 * @dvbdev: pointer to struct dvb_device 218 241 */