On Tue, Oct 06, 2026 at 08:36:31PM +0100, Matt Evans wrote:
> Allow exporters to set the name of buffers, during export or for
> subsequent updates.  This is useful to express buffer-specific debug
> information, indicate state particular to the exporter's usage, etc.
> Only exporters and userspace are expected to set names; it isn't
> sensible for importers to do it.
> 
> Originally, the static dma_buf_set_name() was used for
> DMA_BUF_SET_NAME ioctls, taking a __user string parameter.  Export
> this function as a generic set-name helper, taking a kernel-allocated
> string.  The SET_NAME ioctls now locally duplicate the __user string,
> and use the new function to set the name.
> 
> Signed-off-by: Matt Evans <[email protected]>
> ---
>  drivers/dma-buf/dma-buf.c | 84 +++++++++++++++++++++++++--------------
>  include/linux/dma-buf.h   | 16 +++++---
>  2 files changed, 64 insertions(+), 36 deletions(-)

<...>

> @@ -577,8 +549,19 @@ static long dma_buf_ioctl(struct file *file,
>               return ret;
>  
>       case DMA_BUF_SET_NAME_A:
> -     case DMA_BUF_SET_NAME_B:
> -             return dma_buf_set_name(dmabuf, (const char __user *)arg);
> +     case DMA_BUF_SET_NAME_B: {
> +             char *name = strndup_user((const char __user *)arg,
> +                                       DMA_BUF_NAME_LEN);
> +
> +             if (IS_ERR(name))
> +                     return PTR_ERR(name);
> +
> +             ret = dma_buf_set_name(dmabuf, name);
> +             if (ret)
> +                     kfree(name);

<...>

> +int dma_buf_set_name(struct dma_buf *dmabuf, char *name)
> +{
> +     if (!name)
> +             return -EINVAL;
> +
> +     /* dmabuffs_dname() won't use the string if the length
> +      * (including terminator) exceeds DMA_BUF_NAME_LEN:
> +      */
> +     if (strlen(name) >= DMA_BUF_NAME_LEN)
> +             return -E2BIG;

BTW, in-kernel APIs generally avoid defensive programming, since it adds
overhead for checks that callers are expected to perform. The caller is
responsible for ensuring that the name is valid.

Unless you're writing code specifically for out-of-tree use, which is
also contrary to kernel rules.

Thanks

> +
> +     spin_lock(&dmabuf->name_lock);
> +     kfree(dmabuf->name);
> +     dmabuf->name = name;
> +     spin_unlock(&dmabuf->name_lock);
> +
> +     return 0;
> +}
> +EXPORT_SYMBOL_NS_GPL(dma_buf_set_name, "DMA_BUF");

Reply via email to