[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