> diff --git a/kernel/bpf/helpers.c b/kernel/bpf/helpers.c
> index c18f1e16edee4..e99b643136822 100644
> --- a/kernel/bpf/helpers.c
> +++ b/kernel/bpf/helpers.c
> @@ -4195,6 +4195,95 @@ __bpf_kfunc int bpf_strncasestr(const char *s1__ign, 
> const char *s2__ign,
> +static int __bpf_strncat(char *dst, u32 dsz, const char *src, u32 sz)
> +{
> +     int dlen, slen, space, copied;

[ ... ]

> +     for (copied = 0; copied < space - 1 && copied < sz; copied++) {
> +             __get_kernel_nofault(&cs, src, char, err_out);
> +             if (cs == '\0')
> +                     break;
> +
> +             __put_kernel_nofault(dst + dlen + copied, &cs, char, err_out);
> +
> +             src++;
> +     }
> +     cs = '\0';
> +     __put_kernel_nofault(dst + dlen + copied, &cs, char, err_out);
> +
> +     __get_kernel_nofault(&cs, src, char, err_out);
> +     if (cs != '\0' && sz > copied)
> +             return -E2BIG;
> +
> +     return copied;

Here __bpf_strncat() returns copied, which counts only the bytes
appended from src.  It does not include dlen, the pre-existing length of
dst.

> +err_out:
> +     return -EFAULT;
> +}
> +
> +/**
> + * bpf_strcat - Append non-null bytes from a source string, and 
> null-terminate
> + *              the result
> + * @dst__ign: Destination string.
> + * @dst__sz: Maximum bytes of @dst__ign, includes the trailing NUL.
> + * @src__ign: Source string.
> + *
> + * Return:
> + * * >=0      - Length of the concatenated string.

The kernel-doc for both bpf_strcat() and bpf_strncat() describes the
success return as ">=0 - Length of the concatenated string."

Since __bpf_strncat() returns copied rather than dlen + copied, does the
returned value actually describe the number of bytes appended rather than
the length of the resulting string?

Should either the return be dlen + copied, or the documentation say
"number of bytes appended"?

> + */
> +__bpf_kfunc int bpf_strcat(char *dst__ign, u32 dst__sz, const char *src__ign)
> +{
> +     return __bpf_strncat(dst__ign, dst__sz, src__ign, XATTR_SIZE_MAX);
> +}
> +
> +/**
> + * bpf_strncat - Append non-null bytes from a source string, and 
> null-terminate
> + *               the result
> + * @dst__ign: Destination string.
> + * @dst__sz: Maximum bytes of @dst__ign, includes the trailing NUL.
> + * @src__ign: Source string.
> + * @len: the maximum number of characters to concatenate
> + *
> + * Return:
> + * * >=0      - Length of the concatenated string.

The same "Length of the concatenated string" wording applies here.

> + */
> +__bpf_kfunc int bpf_strncat(char *dst__ign, u32 dst__sz, const char 
> *src__ign,
> +                         u32 len)
> +{
> +     return __bpf_strncat(dst__ign, dst__sz, src__ign, len);
> +}


---
AI reviewed your patch. Please fix the bug or email reply why it's not a bug.
See: https://github.com/kernel-patches/vmtest/blob/master/ci/claude/README.md

CI run summary: https://github.com/kernel-patches/bpf/actions/runs/29323723211

Reply via email to