[lvc-project] [PATCH v6.1] mm/damon: get rid of overlapping areas
Марков Глеб Игоревич
markov.gi at npc-ksb.ru
Wed Jun 24 14:52:45 MSK 2026
Среда, Июнь 24, 2026 14:48 MSK, Марков Глеб Игоревич <markov.gi at npc-ksb.ru> писал(а):
> Среда, Июнь 24, 2026 13:38 MSK, Fedor Pchelkin <pchelkin at ispras.ru> писал(а):
>
> > Патч нужен и для 6.12 наверно, не только 6.1.
> >
> > On Wed, 24. Jun 12:22, Markov Gleb wrote:
> > > Change sscanf() function to avoid possible overlap situation.
> >
> > Наверно не change, а replace чем-то другим. Ведь не меняете же
> > внутренности функции sscanf().
> >
> > >
> > > Found by Linux Verification Center (linuxtesting.org) with SVACE.
> > >
> > > Fixes: 4bc05954d007 ("mm/damon: implement a debugfs-based user space interface")
> > > Signed-off-by: Gleb Markov <markov.gi at npc-ksb.ru>
> > > ---
> > > mm/damon/dbgfs.c | 5 ++++-
> > > 1 file changed, 4 insertions(+), 1 deletion(-)
> > >
> > > diff --git a/mm/damon/dbgfs.c b/mm/damon/dbgfs.c
> > > index b3f454a5c682..62b1e7474445 100644
> > > --- a/mm/damon/dbgfs.c
> > > +++ b/mm/damon/dbgfs.c
> > > @@ -1003,17 +1003,20 @@ static ssize_t dbgfs_monitor_on_write(struct file *file,
> > > {
> > > ssize_t ret;
> > > char *kbuf;
> > > + char *sd_kbuf;
> > >
> > > kbuf = user_input_str(buf, count, ppos);
> > > if (IS_ERR(kbuf))
> > > return PTR_ERR(kbuf);
> > >
> > > /* Remove white space */
> > > - if (sscanf(kbuf, "%s", kbuf) != 1) {
> > > + sd_kbuf = strim(kbuf);
> > > + if (*sd_kbuf == '\0') {
> > > kfree(kbuf);
> > > return -EINVAL;
> > > }
> >
> > sd_kbuf теперь указывает на первый непробельный символ входной
> > буфер-строки. Однако сам kbuf, с которым дальше в функции идёт работа,
> > продолжает указывать на начало исходного буфера с потенциально
> > пробельными символами в начале.
> >
> > Если хотели убрать пробелы из начала, текущий патч этого не решает.
> >
> > Резона в добавлении sd_kbuf не вижу. В целом достаточно
> >
> > kbuf = strim(kbuf);
> >
> > >
> > > +
> >
> > Зачем-то добавленная лишняя пустая строка.
> >
> > > mutex_lock(&damon_dbgfs_lock);
> > > if (!strncmp(kbuf, "on", count)) {
> > > int i;
> > > --
> > > 2.43.0
>
> kbuf - указатель на выделенный буфер (кусок памяти). strim() сместит указатель при обрезке в выделенном
> буфере, при последующем вызове kfree() ожидается очистка того же выделенного блока памяти (начинающегося с того
> же адреса), но при вызове strim(), где в качестве источника и результата будет использоваться указатель на
> ранее выделенный kbuf, в результате отработки skip_spaces(), значение указателя изменится (по результатам
> смещения, в связи с чем в следующем снэпшоте появится срабатывание формата LEAK.
> В идеале работать с выделенным токеном (sd_kbuf) далее чтобы подобных кейсов не возникало.
> Все же хотел бы настоять на замене strncmp() на strcmp(), поскольку таким образом не будет явной
> привязки к передаваемому в метод `count`, а сравнение не изменится по логике.
>
> Предположим, что помимо "on" или "off" будет передан "on " или "off ", что явно корректнее будет
> обрабатываться обычным strim().
>
> В любом случае, исправления относительно работы с обрезанной строкой будут внесены и по итогам
> ответа на это сообщение будут отправлены повторно.
Если сформулировать проще, то strim() вызывает skip_spaces(), который сам указатель сместит относительно
ранее выделенного через kmalloc() блока. Попытка очистки путем вызова kfree() не отработает корректно, а
значит требуется создание временной локальной переменной для сохранения оригинального значения
указателя.
Использование strcmp() вместо strncmp() предлагается лишь на случай использования нестрого инпута.
Отсутствие привязки к передаваемому в метод `count` позволяет более строго сравнивать значения, что
по логике и является корректным поведением.
More information about the lvc-project
mailing list