[lvc-project] [PATCH v6.1] mm/damon: get rid of overlapping areas

Марков Глеб Игоревич markov.gi at npc-ksb.ru
Wed Jun 24 14:48:21 MSK 2026


Среда, Июнь 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().

В любом случае, исправления относительно работы с обрезанной строкой будут внесены и по итогам
ответа на это сообщение будут отправлены повторно.




More information about the lvc-project mailing list