[lvc-project] [PATCH] gfs2: Fix NULL pointer dereference in gfs2_log_flush
Fedor Pchelkin
pchelkin at ispras.ru
Mon Apr 6 18:21:54 MSK 2026
On Mon, 06. Apr 18:05, Николай Кузнецов wrote:
> > В чём заключается ошибка?
> В функцию gfs2_log_flush может прийти нулевой указатель
> sdp->sd_jdesc, после чего будет цепочка вызовов:
> gfs2_log_shutdown(sdp) -> log_pull_tail(sdp) ->
> dist = log_distance(sdp, new_tail, sdp->sd_log_tail), а в log_distance
> уже происходит его разыменование. Согласен, из патча это неясно, перепишу.
>
> > То есть после патча по неизвестной (пока) причине будет пропускаться
> > код, который вроде как и готов обрабатывать нулевой указатель
> Тот код был добавлен как раз в целях избежания разыменования
> в конкретном месте, прикладываю ссылку на коммит:
> [1]https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/fs/gfs2/log.c?id=35264909e9d1973ab9aaa2a1b07cda70f12bb828
Добавляя свою проверку в начало gfs2_log_flush(), нивелируете изменения
этого патча. В нём автор пишет, что да, указатель действительно может
оказаться нулевым на этапе gfs2_log_flush() при таких-то условиях, поэтому
его нужно обработать.
> Там нет полноценной обработки указателя, как я понял,
> только обработка частной траектории выполнения.
>
> В данном коммите нет тега Fixes, я последовал примеру и не стал
> его добавлять.
> Действительно, я думал над тем, чтобы убрать обработку
> указателя в том месте, но старался следовать инструкции с
Нет, проверка, добавленная в 35264909e9d1 ("gfs2: Fix NULL pointer
dereference in gfs2_log_flush") должна быть нужной. Зачем её предлагаете
убирать?
> Мне показалось логичнее сделать ассерт в начале,
> чтобы в следующей строчке сразу было попадание на проверку
> withdrawn.
Это не выглядит логичным, учитывая происходящее в коммите 35264909e9d1
("gfs2: Fix NULL pointer dereference in gfs2_log_flush"). Из него следует,
что указателю валидно быть нулевым - это не ошибочная ситуация на ассерт.
Как вы упомянули выше, Свейс подцепил один конкретный путь
gfs2_log_shutdown(sdp) -> log_pull_tail(sdp) -> log_distance(). Возможно
суть кроется в этом пути?
More information about the lvc-project
mailing list