[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