In the Linux kernel, the following vulnerability has been resolved:
media: i2c: max9286: fix kernel oops when removing module
When removing the max9286 module we get a kernel oops:
Unable to handle kernel paging request at virtual address 000000aa00000094 Mem abort info: ESR = 0x96000004 EC = 0x25: DABT (current EL), IL = 32 bits SET = 0, FnV = 0 EA = 0, S1PTW = 0 FSC = 0x04: level 0 translation fault Data abort info: ISV = 0, ISS = 0x00000004 CM = 0, WnR = 0 user pgtable: 4k pages, 48-bit VAs, pgdp=0000000880d85000 [000000aa00000094] pgd=0000000000000000, p4d=0000000000000000 Internal error: Oops: 96000004 [#1] PREEMPT SMP Modules linked in: fsljruio caamjr rngcore libdes caamkeyblobdesc caamhashdesc caamalgdesc cryptoengine max9271 authenc crct10difce mxcjpegencdec CPU: 2 PID: 713 Comm: rmmod Tainted: G C 5.15.5-00057-gaebcd29c8ed7-dirty #5 Hardware name: Freescale i.MX8QXP MEK (DT) pstate: 80000005 (Nzcv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--) pc : i2cmuxdeladapters+0x24/0xf0 lr : max9286remove+0x28/0xd0 [max9286] sp : ffff800013a9bbf0 x29: ffff800013a9bbf0 x28: ffff00080b6da940 x27: 0000000000000000 x26: 0000000000000000 x25: 0000000000000000 x24: 0000000000000000 x23: ffff000801a5b970 x22: ffff0008048b0890 x21: ffff800009297000 x20: ffff0008048b0f70 x19: 000000aa00000064 x18: 0000000000000000 x17: 0000000000000000 x16: 0000000000000000 x15: 0000000000000000 x14: 0000000000000014 x13: 0000000000000000 x12: ffff000802da49e8 x11: ffff000802051918 x10: ffff000802da4920 x9 : ffff000800030098 x8 : 0101010101010101 x7 : 7f7f7f7f7f7f7f7f x6 : fefefeff6364626d x5 : 8080808000000000 x4 : 0000000000000000 x3 : 0000000000000000 x2 : ffffffffffffffff x1 : ffff00080b6da940 x0 : 0000000000000000 Call trace: i2cmuxdeladapters+0x24/0xf0 max9286remove+0x28/0xd0 [max9286] i2cdeviceremove+0x40/0x110 _devicereleasedriver+0x188/0x234 driverdetach+0xc4/0x150 busremovedriver+0x60/0xe0 driverunregister+0x34/0x64 i2cdeldriver+0x58/0xa0 max9286i2cdriverexit+0x1c/0x490 [max9286] _arm64sysdeletemodule+0x194/0x260 invokesyscall+0x48/0x114 el0svccommon.constprop.0+0xd4/0xfc doel0svc+0x2c/0x94 el0svc+0x28/0x80 el0t64synchandler+0xa8/0x130 el0t64sync+0x1a0/0x1a4
The Oops happens because the I2C client data does not point to max9286priv anymore but to v4l2subdev. The change happened in max9286init() which calls v4l2i2csubdevinit() later on...
Besides fixing the max9286remove() function, remove the call to i2csetclientdata() in max9286probe(), to avoid confusion, and make the necessary changes to max9286init() so that it doesn't have to use i2cget_clientdata() in order to fetch the pointer to priv.