[lvc-project] [PATCH 6.1/6.12] squashfs: fix i_mode type assignment in squashfs_read_inode
Fedor Pchelkin
pchelkin at ispras.ru
Sun Apr 26 12:50:09 MSK 2026
Добрый день!
В первую очередь стоит понять, актуальна ли проблема для апстрима. Если
да, то сначала патч готовится под ветку master [1] основного репозитория
ядра. Если нет, то стоит понять, почему проблемы нет в апстриме - быть
может, её там как-то уже исправили.
[1]: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/
Остальные комментарии см. ниже.
On Fri, 24. Apr 14:47, Makar Semyonov wrote:
> Using |= S_IFREG does not clear existing S_IFMT bits, which can leave
> inode with an invalid type and break S_ISREG() checks, triggering WARN_ON
> in exec path.
Из этого описания слабо понятна суть проблемы, т.к. что такое WARN_ON in
exec path? У вас есть хорошее качественное сообщение об ошибке из
материалов с бэктрейсом и прочим. Подобные вещи рекомендуется вставлять в
патч.
WARNING: CPU: 0 PID: 3987 at fs/exec.c:911 do_open_execat+0x365/0x3e0 fs/exec.c:911
Modules linked in:
CPU: 0 UID: 0 PID: 3987 Comm: syz.6.522 Not tainted syzkaller #0
RIP: 0010:do_open_execat+0x365/0x3e0 fs/exec.c:911
Call Trace:
<TASK>
alloc_bprm+0x2d/0xd30 fs/exec.c:1537
do_execveat_common.isra.0+0x1e6/0x650 fs/exec.c:1936
do_execveat fs/exec.c:2070 [inline]
__do_sys_execveat fs/exec.c:2144 [inline]
__se_sys_execveat fs/exec.c:2138 [inline]
__x64_sys_execveat+0xde/0x120 fs/exec.c:2138
do_syscall_x64 arch/x86/entry/common.c:47 [inline]
do_syscall_64+0xc1/0x1d0 arch/x86/entry/common.c:78
entry_SYSCALL_64_after_hwframe+0x77/0x7f
>
> Fix by masking S_IFMT before setting S_IFREG.
Пока кажется, что патч лишь клеит заплатку на проблему, но не правит её
корневую причину. Вряд ли проблема кроется в squashfs. В материалах к
падению есть другой репро, где используется другая фс.
Также обратите внимание на комментарий перед срабатывающим WARN_ON:
/*
* In the past the regular type check was here. It moved to may_open() in
* 633fb6ac3980 ("exec: move S_ISREG() check earlier"). Since then it is
* an invariant that all non-regular files error out before we get here.
*/
if (WARN_ON_ONCE(!S_ISREG(file_inode(file)->i_mode)))
return ERR_PTR(-EACCES);
Т.е. данная проверка уже должна была пройти раньше, в may_open() - код
на это полагается. Требуется понять, что произошло в поведении ядра,
спровоцированном репродьюсером, из-за чего состояние i_mode внезапно было
изменено между этими событиями. Это ключ к пониманию причины ошибки,
выявленной фаззером, а текущий патч вполне вероятно заглушает лишь
конкретный репродьюсер.
>
> Found by Linux Verification Center (linuxtesting.org) with Syzkaller.
>
Для фикс патчей стоит ставить тег Fixes, чтобы понимать, какой коммит
внёс ошибку.
https://portal.linuxtesting.ru/How-to-send-patches-to-kernel.html#Fixes
More information about the lvc-project
mailing list