[lvc-project] [PATCH] gfs2: Fix NULL pointer dereference in gfs2_log_flush

Fedor Pchelkin pchelkin at ispras.ru
Mon Apr 6 16:32:07 MSK 2026


On Mon, 06. Apr 15:00, Николай Кузнецов wrote:
>    > Без контекста не очень ясно, на какой ветке ядра встретили срабатывание
>    > стат. анализатора и готовили исправление?
> 
>    Под контекстом имеются в виду теги Fixes или Cc? Если нет, то как его указать?

Теги Fixes в фикс-патчи ставить надо, но это другое.  Контекст мне уже
пояснили, я просто не заметил сначала знакомые CS MSU в почтовом адресе.

> 
>    Версия ядра 6.1.164.

ОК, для определённости тогда будем рассматривать ситуацию на этой версии.

>    > Бывает полезно осматривать
>    > состояние исследуемого кода в самом свежем апстрим-репозитории ядра [1].
>    > Каков статус проблемы там?
> 
>    Смотрел исправляемый файл в апстрим репозитории, там никаких действий по
>    предотвращению разыменования нулевого указателя не увидел, сделал вывод,
>    что ошибка всё ещё присутствует.

В чём заключается ошибка?  Из описания текущего патча её честно говоря
не понять..  Что и где должно разыменоваться и упасть?

>    > gfs2_assert_withdraw() предотвращает выполнение текущей функции?
>    > Насколько понимаю, нет. Т.е. от потенциального дальнейшего креша не
>    > спасёт
> 
>    Как я понял, после ассерта и в итоге withdraw будет выставлен
>    флаг SDF_WITHDRAWN ([1]https://elixir.bootlin.com/linux/v6.1.164/source/fs/gfs2/util.c#L339)
>    и тогда, сразу после ассерта, на проверке в
>    строчке [2]https://elixir.bootlin.com/linux/v6.1.164/source/fs/gfs2/log.c#L1051
>    будет goto out, что позволит избежать проблемы.

После патча функция gfs2_log_flush() будет выглядеть так:

void gfs2_log_flush(struct gfs2_sbd *sdp, struct gfs2_glock *gl, u32 flags)
{
	...
	gfs2_assert_withdraw(sdp, sdp->sd_jdesc != NULL); // допустим sdp->sd_jdesc правда NULL

repeat:
	/*
	 * Do this check while holding the log_flush_lock to prevent new
	 * buffers from being added to the ail via gfs2_pin()
	 */
	if (gfs2_withdrawn(sdp) || !test_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags))
		goto out;                           <<<<<============ тогда здесь идём в метку out 

	...
	if (sdp->sd_jdesc)                    <<<<<========= а здесь вроде готовы обработать указатель
		gfs2_log_submit_bio(&sdp->sd_jdesc->jd_log_bio, REQ_OP_WRITE);

out:
	...
}

Это всё на версии 6.1.164.

То есть после патча по неизвестной (пока) причине будет пропускаться
код, который вроде как и готов обрабатывать нулевой указатель..



More information about the lvc-project mailing list