libbpf: Use proper errno value in nlattr
authorAnton Protopopov <a.s.protopopov@gmail.com>
Sat, 10 May 2025 18:20:11 +0000 (18:20 +0000)
committerAndrii Nakryiko <andrii@kernel.org>
Mon, 12 May 2025 22:22:54 +0000 (15:22 -0700)
Return value of the validate_nla() function can be propagated all the
way up to users of libbpf API. In case of error this libbpf version
of validate_nla returns -1 which will be seen as -EPERM from user's
point of view. Instead, return a more reasonable -EINVAL.

Fixes: bbf48c18ee0c ("libbpf: add error reporting in XDP")
Suggested-by: Andrii Nakryiko <andrii@kernel.org>
Signed-off-by: Anton Protopopov <a.s.protopopov@gmail.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20250510182011.2246631-1-a.s.protopopov@gmail.com
tools/lib/bpf/nlattr.c

index 975e265eab3bfec5378a5c4849813dfb672ce018..06663f9ea581f9b77731d80baaf89d3994b91548 100644 (file)
@@ -63,16 +63,16 @@ static int validate_nla(struct nlattr *nla, int maxtype,
                minlen = nla_attr_minlen[pt->type];
 
        if (libbpf_nla_len(nla) < minlen)
-               return -1;
+               return -EINVAL;
 
        if (pt->maxlen && libbpf_nla_len(nla) > pt->maxlen)
-               return -1;
+               return -EINVAL;
 
        if (pt->type == LIBBPF_NLA_STRING) {
                char *data = libbpf_nla_data(nla);
 
                if (data[libbpf_nla_len(nla) - 1] != '\0')
-                       return -1;
+                       return -EINVAL;
        }
 
        return 0;
@@ -118,19 +118,18 @@ int libbpf_nla_parse(struct nlattr *tb[], int maxtype, struct nlattr *head,
                if (policy) {
                        err = validate_nla(nla, maxtype, policy);
                        if (err < 0)
-                               goto errout;
+                               return err;
                }
 
-               if (tb[type])
+               if (tb[type]) {
                        pr_warn("Attribute of type %#x found multiple times in message, "
                                "previous attribute is being ignored.\n", type);
+               }
 
                tb[type] = nla;
        }
 
-       err = 0;
-errout:
-       return err;
+       return 0;
 }
 
 /**