[lvc-project] [PATCH 5.10] smb: client: fix smbdirect_recv_io leak in smbd_negotiate() error path

Fedor Pchelkin pchelkin at ispras.ru
Fri Oct 31 11:05:00 MSK 2025


On Fri, 31. Oct 10:38, Andrey Troshin wrote:
>    Добрый день, не понял описание проблемы, опишите пожалуйста подробнее.
> Ну и опишите пожалуйста что требуется с нашей стороны (проверка этой гипотезы/репатч)...

Добавляемый put_receive_buffer() будет повторно делать ib_dma_unmap_single()
после того как это уже сделал smbd_post_recv() при обработке ошибки
внутри себя.

smbd_negotiate()
  smbd_post_recv()
    if (rc) {
      ib_dma_unmap_single()
  if (rc)
    put_receive_buffer()
      ib_dma_unmap_single() // incorrect

С Вашей стороны требуется анализ исправлений при их портировании в
стабильную ветку.  В данном случае, портируемый патч может содержать уже
свою проблему.

В апстриме всё же эту проблему похоже решили, стоит обратить внимание на
коммит 047682c370b6 ("smb: client: make sure we call ib_dma_unmap_single()
only if we called ib_dma_map_single already").  В 5.10 будет корректно
затаскивать серию из двух патчей, где бэкпорт 047682c370b6 идёт первым.

> 
> 
> 
>    ----------------
> 
>    Кому: Andrey Troshin (drtrosh at yandex-team.ru);
> 
>    Копия: lvc-project at linuxtesting.org;
> 
>    Тема: [lvc-project] [PATCH 5.10] smb: client: fix smbdirect_recv_io leak in smbd_negotiate() error path;
> 
>    30.10.2025, 16:59, "Fedor Pchelkin" <pchelkin at ispras.ru>:
> 
>      On Thu, 30. Oct 10:43, Andrey Troshin wrote:
> 
>       @@ -1083,8 +1083,10 @@ static int smbd_negotiate(struct smbd_connection *info)
>                log_rdma_event(INFO, "smbd_post_recv rc=%d iov.addr=%llx iov.length=%x iov.lkey=%x\n",
>                               rc, response->sge.addr,
>                               response->sge.length, response->sge.lkey);
>       - if (rc)
>       + if (rc) {
>       + put_receive_buffer(info, response);
> 
>      Вижу здесь потенциальный баг в upstream-коммите.
>      smbd_post_recv() на одном из своих путей обработки ошибки размапливает
>      участок памяти с ib_dma_unmap_single(). Добавляемый put_receive_buffer()
>      тоже это делает.
> 
>                        return rc;
>       + }
> 
>                init_completion(&info->negotiate_completion);
>                info->negotiate_done = false;
>       --
>       2.34.1



More information about the lvc-project mailing list