]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
bpf: Fix key serial argument of bpf_lookup_user_key()
authorJames Bottomley <James.Bottomley@HansenPartnership.com>
Tue, 17 Jun 2025 14:57:36 +0000 (10:57 -0400)
committerAlexei Starovoitov <ast@kernel.org>
Wed, 18 Jun 2025 01:15:27 +0000 (18:15 -0700)
The underlying lookup_user_key() function uses a signed 32 bit integer
for key serial numbers because legitimate serial numbers are positive
(and > 3) and keyrings are negative.  Using a u32 for the keyring in
the bpf function doesn't currently cause any conversion problems but
will start to trip the signed to unsigned conversion warnings when the
kernel enables them, so convert the argument to signed (and update the
tests accordingly) before it acquires more users.

Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Reviewed-by: Roberto Sassu <roberto.sassu@huawei.com>
Link: https://lore.kernel.org/r/84cdb0775254d297d75e21f577089f64abdfbd28.camel@HansenPartnership.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
kernel/trace/bpf_trace.c
tools/testing/selftests/bpf/bpf_kfuncs.h
tools/testing/selftests/bpf/progs/rcu_read_lock.c
tools/testing/selftests/bpf/progs/test_lookup_key.c
tools/testing/selftests/bpf/progs/test_sig_in_xattr.c
tools/testing/selftests/bpf/progs/test_verify_pkcs7_sig.c
tools/testing/selftests/bpf/progs/verifier_ref_tracking.c

index 132c8be6f635cdb65a060732a7d361115b2fef91..0a06ea6638fe620676ccd1b8bb8274ed5c57ba54 100644 (file)
@@ -1270,7 +1270,7 @@ __bpf_kfunc_start_defs();
  * Return: a bpf_key pointer with a valid key pointer if the key is found, a
  *         NULL pointer otherwise.
  */
-__bpf_kfunc struct bpf_key *bpf_lookup_user_key(u32 serial, u64 flags)
+__bpf_kfunc struct bpf_key *bpf_lookup_user_key(s32 serial, u64 flags)
 {
        key_ref_t key_ref;
        struct bpf_key *bkey;
index 8215c9b3115e45abcb990627acc178cf01971976..9386dfe8b8849edf797d1adda60eac8f4d2f246f 100644 (file)
@@ -69,7 +69,7 @@ extern int bpf_get_file_xattr(struct file *file, const char *name,
                              struct bpf_dynptr *value_ptr) __ksym;
 extern int bpf_get_fsverity_digest(struct file *file, struct bpf_dynptr *digest_ptr) __ksym;
 
-extern struct bpf_key *bpf_lookup_user_key(__u32 serial, __u64 flags) __ksym;
+extern struct bpf_key *bpf_lookup_user_key(__s32 serial, __u64 flags) __ksym;
 extern struct bpf_key *bpf_lookup_system_key(__u64 id) __ksym;
 extern void bpf_key_put(struct bpf_key *key) __ksym;
 extern int bpf_verify_pkcs7_signature(struct bpf_dynptr *data_ptr,
index 43637ee2cdcd2aba154077b0420892d7393c731d..3a868a1993492674c4cb72bd0a516827e7eb8871 100644 (file)
@@ -16,10 +16,11 @@ struct {
        __type(value, long);
 } map_a SEC(".maps");
 
-__u32 user_data, key_serial, target_pid;
+__u32 user_data, target_pid;
+__s32 key_serial;
 __u64 flags, task_storage_val, cgroup_id;
 
-struct bpf_key *bpf_lookup_user_key(__u32 serial, __u64 flags) __ksym;
+struct bpf_key *bpf_lookup_user_key(__s32 serial, __u64 flags) __ksym;
 void bpf_key_put(struct bpf_key *key) __ksym;
 void bpf_rcu_read_lock(void) __ksym;
 void bpf_rcu_read_unlock(void) __ksym;
index cdbbb12f1491a542f06d4481577f5f29f34cdb93..1f7e1e59b0730adbab514197ca9f94077d9e2e71 100644 (file)
 char _license[] SEC("license") = "GPL";
 
 __u32 monitored_pid;
-__u32 key_serial;
+__s32 key_serial;
 __u32 key_id;
 __u64 flags;
 
-extern struct bpf_key *bpf_lookup_user_key(__u32 serial, __u64 flags) __ksym;
+extern struct bpf_key *bpf_lookup_user_key(__s32 serial, __u64 flags) __ksym;
 extern struct bpf_key *bpf_lookup_system_key(__u64 id) __ksym;
 extern void bpf_key_put(struct bpf_key *key) __ksym;
 
index 8ef6b39335b678224e4591887286c9fccb78d0b9..34b30e2603f0febc829b8d573ccbb587cda688b1 100644 (file)
@@ -40,7 +40,7 @@ char digest[MAGIC_SIZE + SIZEOF_STRUCT_FSVERITY_DIGEST + SHA256_DIGEST_SIZE];
 __u32 monitored_pid;
 char sig[MAX_SIG_SIZE];
 __u32 sig_size;
-__u32 user_keyring_serial;
+__s32 user_keyring_serial;
 
 SEC("lsm.s/file_open")
 int BPF_PROG(test_file_open, struct file *f)
index e96d09e111155b28902fac83690427160f408e5f..ff8d755548b99c6b7d5051bd9424ddd659ff9aff 100644 (file)
@@ -17,7 +17,7 @@
 #define MAX_SIG_SIZE 1024
 
 __u32 monitored_pid;
-__u32 user_keyring_serial;
+__s32 user_keyring_serial;
 __u64 system_keyring_id;
 
 struct data {
index 683a882b3e6d5e284e689b653d741a9835a66455..910365201f68395246bbc5bf8e08fab2aaff3cdb 100644 (file)
@@ -27,7 +27,7 @@ struct bpf_key {} __attribute__((preserve_access_index));
 
 extern void bpf_key_put(struct bpf_key *key) __ksym;
 extern struct bpf_key *bpf_lookup_system_key(__u64 id) __ksym;
-extern struct bpf_key *bpf_lookup_user_key(__u32 serial, __u64 flags) __ksym;
+extern struct bpf_key *bpf_lookup_user_key(__s32 serial, __u64 flags) __ksym;
 
 /* BTF FUNC records are not generated for kfuncs referenced
  * from inline assembly. These records are necessary for