On Tue, 09 Jun 2026 18:04:46 -0700
Viacheslav Dubeyko <[email protected]> wrote:

> On Mon, 2026-06-08 at 10:55 +0100, [email protected] wrote:
> > From: David Laight <[email protected]>
> > 
> > xattr_name is kmalloc()ed at the (assumed) maximal size and then the
> > prefix
> > and name concatenated together.
> > Use memcpy() for the prefix - its length is passed and strscpy() for
> > the
> > name to ensure it really doesnt overflow.
> > 
> > Prior to bf29e886b242c the buffers were smaller and on-stack.
> > (But I cant see the copy in the old code.)
> > I am also not sure why the buffer isnt created "just long enough".  
> 
> What do you mean by "the buffer isn't created just long enough"? And
> what is your vision of correct implementation of the logic?

The old code is:
>       xattr_name = kmalloc(xattr_name_len, GFP_KERNEL);
>       if (!xattr_name)
>               return -ENOMEM;
>       strcpy(xattr_name, prefix);
>       strcpy(xattr_name + prefixlen, name);

It would be more usual to do:
        size_t name_len = strlen(name) + 1;
        xattr_name = kmalloc(prefixlen + name_len);
        memcpy(xattr_name, prefix, prefixlen)
        memcpy(xattr_name + prefixlen, name, name_len);
So that the buffer is allocated the correct size for the strings.

(Not that it really makes much difference whether you do kmalloc(32) or
kmalloc(1024) for a temporary buffer - both come of a per-cpu list.)

What I couldn't decide, but seems to be inferred from some of fixes,
was whether a double-terminator was needed.
(That might just be the attribute value.)
One of the related functions got fixed to zero fill a buffer in a loop
because (AFICT) something was reading beyond a '\0' terminator.

This code does seem strange though.
It seems to add a text prefix here and then the called function does
string compares to find out which prefix has added and than act
differently based on the prefix.
I didn't try to follow things any further.

I also don't know if 'name' itself can be 127 wide characters (before the
prefix is added)?
The fixed length buffer isn't long enough if all 127 characters require
6 bytes to encode.

-- David

> 
> Thanks,
> Slava.

Reply via email to