[lvc-project] [PATCH] misc: sram: Fix NULL pointer dereference in sram_probe
Fedor Pchelkin
pchelkin at ispras.ru
Fri Mar 7 00:59:02 MSK 2025
Здравствуйте!
[ если ранее не взаимодействовали с патчами в ядро Linux, рекомендуется
предварительно отправлять их в lvc-patches at linuxtesting.org, где
некоторые вещи можно обсудить/отладить до отправки исправления в
международные списки рассылки ]
Несколько моментов по оформлению и сути патчей ниже.
On Wed, 05. Mar 17:50, Andrey Tsygunka wrote:
> Added check for res for NULL value.
Describe your changes in imperative mood, e.g. “make xyzzy do frotz”
instead of “[This patch] makes xyzzy do frotz” or “[I] changed xyzzy
to do frotz”, as if you are giving orders to the codebase to change
its behaviour.
https://www.kernel.org/doc/html/latest/process/submitting-patches.html#describe-your-changes
Строки обычного текста допускаются до 75 символов. Абзацы разделяют
пустой строкой.
> If the passed device-tree contains a node for sram-device
> without a specified '<reg>' property value, for example:
>
> sram: sram at 5c0000000 {
> compatible = "nvidia,tegra186-sysram";
> };
>
> And the of_device_id[] '.data' element contains a sram_config*
> with '.map_only_reserved = true' property, we get the error:
>
> [ 2.130808][ T1] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000000
> [ 2.133389][ T1] Mem abort info:
> [ 2.134319][ T1] ESR = 0x0000000096000004
> [ 2.135484][ T1] EC = 0x25: DABT (current EL), IL = 32 bits
> [ 2.136816][ T1] SET = 0, FnV = 0
> [ 2.137883][ T1] EA = 0, S1PTW = 0
> [ 2.138954][ T1] FSC = 0x04: level 0 translation fault
> [ 2.140203][ T1] Data abort info:
> [ 2.141162][ T1] ISV = 0, ISS = 0x00000004
> [ 2.142246][ T1] CM = 0, WnR = 0
> [ 2.144038][ T1] [0000000000000000] user address but active_mm is swapper
> [ 2.146003][ T1] Internal error: Oops: 0000000096000004 [#1] PREEMPT SMP
> [ 2.147589][ T1] Modules linked in:
> [ 2.148735][ T1] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 6.1.96 #1
> [ 2.150051][ T1] Hardware name: linux,dummy-virt (DT)
> [ 2.151492][ T1] pstate: 80000005 (Nzcv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
> [ 2.152996][ T1] pc : sram_probe+0x134/0xd30
> [ 2.154517][ T1] lr : sram_probe+0x114/0xd30
> [ 2.155710][ T1] sp : ffff80000efdb820
> [ 2.156443][ T1] x29: ffff80000efdb8d0 x28: 0000000000000000 x27: ffff80000efdb878
> [ 2.158173][ T1] x26: 0000000000000000 x25: ffff0000ff816bc8 x24: 0000000000000000
> [ 2.159828][ T1] x23: ffff0000c0cb0480 x22: ffff8000099be080 x21: ffff0000c0bc4000
> [ 2.161554][ T1] x20: ffff80000c14cac8 x19: fffffffffffffffe x18: 0000000000000000
> [ 2.163148][ T1] x17: 203d20647561625f x16: 65736162202c3331 x15: 0000000000000028
> [ 2.164850][ T1] x14: 0000000000000d2e x13: 0000000000000d2f x12: ffff80000e410d00
> [ 2.166514][ T1] x11: 0000000000000003 x10: ffff80000ec93074 x9 : ffff80000e406000
> [ 2.168194][ T1] x8 : ffff80000efdb518 x7 : ffff0000c0a50000 x6 : 0000000000000000
> [ 2.169306][ T1] x5 : ffff0000c0a50000 x4 : 0000000000000000 x3 : ffff800009946e88
> [ 2.170646][ T1] x2 : ffff0000ff816bb0 x1 : ffff0000c0bc4010 x0 : 0000000000000000
> [ 2.172457][ T1] Call trace:
> [ 2.173114][ T1] sram_probe+0x134/0xd30
> [ 2.174334][ T1] platform_probe+0x94/0x130
> [ 2.175589][ T1] really_probe+0x124/0x580
> [ 2.176706][ T1] __driver_probe_device+0xd0/0x1f0
> [ 2.177885][ T1] driver_probe_device+0x50/0x1c0
> [ 2.179037][ T1] __device_attach_driver+0x140/0x220
> [ 2.180274][ T1] bus_for_each_drv+0xbc/0x130
> [ 2.181423][ T1] __device_attach+0xec/0x2c0
> [ 2.182580][ T1] device_initial_probe+0x24/0x40
> [ 2.183734][ T1] bus_probe_device+0xd8/0xe0
> [ 2.184826][ T1] device_add+0x67c/0xc80
> [ 2.185800][ T1] of_device_add+0x58/0x80
> [ 2.186752][ T1] of_platform_device_create_pdata+0xd0/0x1b0
> [ 2.187923][ T1] of_platform_bus_create+0x27c/0x6f0
> [ 2.188998][ T1] of_platform_populate+0xac/0x1d0
> [ 2.190030][ T1] of_platform_default_populate_init+0x10c/0x130
> [ 2.191409][ T1] do_one_initcall+0xdc/0x510
> [ 2.192441][ T1] kernel_init_freeable+0x43c/0x4d8
> [ 2.193485][ T1] kernel_init+0x2c/0x1e0
> [ 2.194496][ T1] ret_from_fork+0x10/0x20
> [ 2.195972][ T1] Code: f9002bff f90033fb f941e822 f90003e2 (a9400001)
> [ 2.197354][ T1] ---[ end trace 0000000000000000 ]---
> [ 2.198333][ T1] Kernel panic - not syncing: Oops: Fatal exception
Лучше вставлять только полезную и нужную информацию из логов. Например,
в данном случае информация о временных метках не нужна, содержимое
регистров не важно для понимания проблемы.
Остальное с наименованием ошибки, hardware, kernel version и самим
бэктрейсом ошибки конечно являются важным.
https://www.kernel.org/doc/html/latest/process/submitting-patches.html#backtraces-in-commit-messages
>
> Found by Linux Verification Center (linuxtesting.org) with SVACE.
>
Если патч исправляет баг в ядре, то желателен тег Fixes. Если хотите
видеть патч в stable-ветках, тег Cc: stable at vger.kernel.org
https://portal.linuxtesting.ru/How-to-send-patches-to-kernel.html#Fixes
https://portal.linuxtesting.ru/How-to-send-patches-to-kernel.html#Порядок-тегов
> Signed-off-by: Andrey Tsygunka <aitsygunka at yandex.ru>
> ---
> drivers/misc/sram.c | 9 +++++++--
> 1 file changed, 7 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/misc/sram.c b/drivers/misc/sram.c
> index e5069882457e..c8ba8ebd4364 100644
> --- a/drivers/misc/sram.c
> +++ b/drivers/misc/sram.c
> @@ -410,8 +410,13 @@ static int sram_probe(struct platform_device *pdev)
> if (IS_ERR(clk))
> return PTR_ERR(clk);
>
> - ret = sram_reserve_regions(sram,
> - platform_get_resource(pdev, IORESOURCE_MEM, 0));
> + res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> + if (unlikely(res == NULL)) {
Использование likely/unlikely - вмешательство в дела компилятора. Стоит
употреблять только тогда, когда данные подсказки компилятору
действительно оправданны на практике (результаты бенчмарков). Иначе
современные компиляторы разберутся и без того, лишние подсказки наоборот
могут сбить их с толку и даже _ухудшить_ положение дел. Этап пробинга
однозначно нельзя отнести к путям, чувствительным к производительности.
Лучше обойтись без unlikely.
Проверки на NULL обычно принято делать посредством (!pointer), о чём
также сообщает scripts/checkpatch.pl
if (!res) {
...
}
> + dev_err(&pdev->dev, "invalid resource\n");
> + return -EINVAL;
> + }
> +
> + ret = sram_reserve_regions(sram, res);
> if (ret)
> return ret;
>
> --
> 2.25.1
More information about the lvc-project
mailing list