From: Will Deacon <will(a)kernel.org>
stable inclusion
from stable-v6.6.51
commit 1b2770e27d6d952f491bb362b657e5b2713c3efd
category: bugfix
bugzilla: https://gitee.com/src-openeuler/kernel/issues/IAU9OF
CVE: CVE-2024-46847
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id…
--------------------------------
commit 3e3de7947c751509027d26b679ecd243bc9db255 upstream.
Commit 8c61291fd850 ("mm: fix incorrect vbq reference in
purge_fragmented_block") extended the 'vmap_block' structure to contain a
'cpu' field which is set at allocation time to the id of the initialising
CPU.
When a new 'vmap_block' is being instantiated by new_vmap_block(), the
partially initialised structure is added to the local 'vmap_block_queue'
xarray before the 'cpu' field has been initialised. If another CPU is
concurrently walking the xarray (e.g. via vm_unmap_aliases()), then it
may perform an out-of-bounds access to the remote queue thanks to an
uninitialised index.
This has been observed as UBSAN errors in Android:
| Internal error: UBSAN: array index out of bounds: 00000000f2005512 [#1] PREEMPT SMP
|
| Call trace:
| purge_fragmented_block+0x204/0x21c
| _vm_unmap_aliases+0x170/0x378
| vm_unmap_aliases+0x1c/0x28
| change_memory_common+0x1dc/0x26c
| set_memory_ro+0x18/0x24
| module_enable_ro+0x98/0x238
| do_init_module+0x1b0/0x310
Move the initialisation of 'vb->cpu' in new_vmap_block() ahead of the
addition to the xarray.
Link: https://lkml.kernel.org/r/20240812171606.17486-1-will@kernel.org
Fixes: 8c61291fd850 ("mm: fix incorrect vbq reference in purge_fragmented_block")
Signed-off-by: Will Deacon <will(a)kernel.org>
Reviewed-by: Baoquan He <bhe(a)redhat.com>
Reviewed-by: Uladzislau Rezki (Sony) <urezki(a)gmail.com>
Cc: Zhaoyang Huang <zhaoyang.huang(a)unisoc.com>
Cc: Hailong.Liu <hailong.liu(a)oppo.com>
Cc: Christoph Hellwig <hch(a)infradead.org>
Cc: Lorenzo Stoakes <lstoakes(a)gmail.com>
Cc: Thomas Gleixner <tglx(a)linutronix.de>
Cc: <stable(a)vger.kernel.org>
Signed-off-by: Andrew Morton <akpm(a)linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh(a)linuxfoundation.org>
Signed-off-by: Jinjiang Tu <tujinjiang(a)huawei.com>
---
mm/vmalloc.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/mm/vmalloc.c b/mm/vmalloc.c
index 8a4bd4fb6d65..cb0951fea238 100644
--- a/mm/vmalloc.c
+++ b/mm/vmalloc.c
@@ -2616,6 +2616,7 @@ static void *new_vmap_block(unsigned int order, gfp_t gfp_mask)
vb->dirty_max = 0;
bitmap_set(vb->used_map, 0, (1UL << order));
INIT_LIST_HEAD(&vb->free_list);
+ vb->cpu = raw_smp_processor_id();
xa = addr_to_vb_xa(va->va_start);
vb_idx = addr_to_vb_idx(va->va_start);
@@ -2632,7 +2633,6 @@ static void *new_vmap_block(unsigned int order, gfp_t gfp_mask)
* integrity together with list_for_each_rcu from read
* side.
*/
- vb->cpu = raw_smp_processor_id();
vbq = per_cpu_ptr(&vmap_block_queue, vb->cpu);
spin_lock(&vbq->lock);
list_add_tail_rcu(&vb->free_list, &vbq->free);
--
2.34.1
From: Chen Ridong <chenridong(a)huawei.com>
hulk inclusion
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/IAU173
--------------------------------
The following bug was triggered when performing syzkaller test:
BUG: KASAN: slab-out-of-bounds in __kuid_val include/linux/uidgid.h:36
BUG: KASAN: slab-out-of-bounds in uid_eq include/linux/uidgid.h:63 [inline]
BUG: KASAN: slab-out-of-bounds in key_task_permission+0x394/0x410
security/keys/permission.c:54
Read of size 4 at addr ffff88813c3ab618 by task stress-ng/4362
CPU: 2 PID: 4362 Comm: stress-ng Not tainted 5.10.0-14930-gafbffd6c3ede #15
Call Trace:
__dump_stack lib/dump_stack.c:82 [inline]
dump_stack+0x107/0x167 lib/dump_stack.c:123
print_address_description.constprop.0+0x19/0x170 mm/kasan/report.c:400
__kasan_report.cold+0x6c/0x84 mm/kasan/report.c:560
kasan_report+0x3a/0x50 mm/kasan/report.c:585
__kuid_val include/linux/uidgid.h:36 [inline]
uid_eq include/linux/uidgid.h:63 [inline]
key_task_permission+0x394/0x410 security/keys/permission.c:54
search_nested_keyrings+0x90e/0xe90 security/keys/keyring.c:793
keyring_search_rcu+0x1b6/0x310 security/keys/keyring.c:922
search_cred_keyrings_rcu+0x111/0x2e0 security/keys/process_keys.c:459
search_process_keyrings_rcu+0x1d/0x310 security/keys/process_keys.c:544
lookup_user_key+0x782/0x12e0 security/keys/process_keys.c:762
keyctl_invalidate_key+0x20/0x190 security/keys/keyctl.c:434
__do_sys_keyctl security/keys/keyctl.c:1978 [inline]
__se_sys_keyctl+0x1de/0x5b0 security/keys/keyctl.c:1880
do_syscall_64+0x30/0x40 arch/x86/entry/common.c:46
entry_SYSCALL_64_after_hwframe+0x67/0xd1
This issue was also reported by syzbot [1].
It can be reproduced by following these steps(more details [2]):
1.Obtain more than 32 inputs that have similar hashes, which end with the
pattern '0xxxxxxxe6'.
2.Reboot and add the keys obtained in step 1.
The reproducer demonstrates how this issue happened:
1.In the search_nested_keyrings function, when it iterates through the
slots in a node(below tag ascend_to_node), and the slot pointer is meta
and node->back_pointer != NULL, it will proceed to descend_to_node.
However, there is an exception. If node is the root, and one of the
slots points to a shortcut, it will be treated as a keyring.
2.Whether the ptr is keyring decided by keyring_ptr_is_keyring function.
However, KEYRING_PTR_SUBTYPE is 0x2UL, the same as
ASSOC_ARRAY_PTR_SUBTYPE_MASK.
3.When 32 keys with the similar hashes are added to the tree, the ROOT has
keys with hashes that are not similar (e.g. slot 0) and it splits NODE
A without using a shortcut. When NODE A is filled with keys that all
hashes are xxe6, the keys are similar, NODE A will split with a shortcut.
Finally, it forms the tree as shown below, where slot 6 points to a
shortcut.
NODE A
+------>+---+
ROOT | | 0 | xxe6
+---+ | +---+
xxxx | 0 | shortcut : : xxe6
+---+ | +---+
xxe6 : : | | | xxe6
+---+ | +---+
| 6 |---+ : : xxe6
+---+ +---+
xxe6 : : | f | xxe6
+---+ +---+
xxe6 | f |
+---+
4.As mentioned above, If a slot(slot 6) of the root points to a shortcut,
it may be mistakenly be transferred to a key*, leading to an read
out-of-bounds read.
To fix this issue, one should jump to descend_to_node if the pointer is a
shortcut.
[1] https://lore.kernel.org/all/000000000000cbb7860611f61147@google.com/T/
[2] https://lore.kernel.org/linux-kernel/1cfa878e-8c7b-4570-8606-21daf5e13ce7@h…
Fixes: b2a4df200d57 ("KEYS: Expand the capacity of a keyring")
Reported-by: syzbot+5b415c07907a2990d1a3(a)syzkaller.appspotmail.com
Signed-off-by: Chen Ridong <chenridong(a)huawei.com>
Signed-off-by: Yi Yang <yiyang13(a)huawei.com>
---
security/keys/keyring.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/security/keys/keyring.c b/security/keys/keyring.c
index 4448758f643a..747ae047ae1c 100644
--- a/security/keys/keyring.c
+++ b/security/keys/keyring.c
@@ -772,7 +772,9 @@ static bool search_nested_keyrings(struct key *keyring,
for (; slot < ASSOC_ARRAY_FAN_OUT; slot++) {
ptr = READ_ONCE(node->slots[slot]);
- if (assoc_array_ptr_is_meta(ptr) && node->back_pointer)
+ if (assoc_array_ptr_is_meta(ptr) &&
+ (node->back_pointer ||
+ assoc_array_ptr_is_shortcut(ptr)))
goto descend_to_node;
if (!keyring_ptr_is_keyring(ptr))
--
2.25.1
From: Chen Ridong <chenridong(a)huawei.com>
hulk inclusion
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/IAU173
--------------------------------
The following bug was triggered when performing syzkaller test:
BUG: KASAN: slab-out-of-bounds in __kuid_val include/linux/uidgid.h:36
BUG: KASAN: slab-out-of-bounds in uid_eq include/linux/uidgid.h:63 [inline]
BUG: KASAN: slab-out-of-bounds in key_task_permission+0x394/0x410
security/keys/permission.c:54
Read of size 4 at addr ffff88813c3ab618 by task stress-ng/4362
CPU: 2 PID: 4362 Comm: stress-ng Not tainted 5.10.0-14930-gafbffd6c3ede #15
Call Trace:
__dump_stack lib/dump_stack.c:82 [inline]
dump_stack+0x107/0x167 lib/dump_stack.c:123
print_address_description.constprop.0+0x19/0x170 mm/kasan/report.c:400
__kasan_report.cold+0x6c/0x84 mm/kasan/report.c:560
kasan_report+0x3a/0x50 mm/kasan/report.c:585
__kuid_val include/linux/uidgid.h:36 [inline]
uid_eq include/linux/uidgid.h:63 [inline]
key_task_permission+0x394/0x410 security/keys/permission.c:54
search_nested_keyrings+0x90e/0xe90 security/keys/keyring.c:793
keyring_search_rcu+0x1b6/0x310 security/keys/keyring.c:922
search_cred_keyrings_rcu+0x111/0x2e0 security/keys/process_keys.c:459
search_process_keyrings_rcu+0x1d/0x310 security/keys/process_keys.c:544
lookup_user_key+0x782/0x12e0 security/keys/process_keys.c:762
keyctl_invalidate_key+0x20/0x190 security/keys/keyctl.c:434
__do_sys_keyctl security/keys/keyctl.c:1978 [inline]
__se_sys_keyctl+0x1de/0x5b0 security/keys/keyctl.c:1880
do_syscall_64+0x30/0x40 arch/x86/entry/common.c:46
entry_SYSCALL_64_after_hwframe+0x67/0xd1
This issue was also reported by syzbot [1].
It can be reproduced by following these steps(more details [2]):
1.Obtain more than 32 inputs that have similar hashes, which end with the
pattern '0xxxxxxxe6'.
2.Reboot and add the keys obtained in step 1.
The reproducer demonstrates how this issue happened:
1.In the search_nested_keyrings function, when it iterates through the
slots in a node(below tag ascend_to_node), and the slot pointer is meta
and node->back_pointer != NULL, it will proceed to descend_to_node.
However, there is an exception. If node is the root, and one of the
slots points to a shortcut, it will be treated as a keyring.
2.Whether the ptr is keyring decided by keyring_ptr_is_keyring function.
However, KEYRING_PTR_SUBTYPE is 0x2UL, the same as
ASSOC_ARRAY_PTR_SUBTYPE_MASK.
3.When 32 keys with the similar hashes are added to the tree, the ROOT has
keys with hashes that are not similar (e.g. slot 0) and it splits NODE
A without using a shortcut. When NODE A is filled with keys that all
hashes are xxe6, the keys are similar, NODE A will split with a shortcut.
Finally, it forms the tree as shown below, where slot 6 points to a
shortcut.
NODE A
+------>+---+
ROOT | | 0 | xxe6
+---+ | +---+
xxxx | 0 | shortcut : : xxe6
+---+ | +---+
xxe6 : : | | | xxe6
+---+ | +---+
| 6 |---+ : : xxe6
+---+ +---+
xxe6 : : | f | xxe6
+---+ +---+
xxe6 | f |
+---+
4.As mentioned above, If a slot(slot 6) of the root points to a shortcut,
it may be mistakenly be transferred to a key*, leading to an read
out-of-bounds read.
To fix this issue, one should jump to descend_to_node if the pointer is a
shortcut.
[1] https://lore.kernel.org/all/000000000000cbb7860611f61147@google.com/T/
[2] https://lore.kernel.org/linux-kernel/1cfa878e-8c7b-4570-8606-21daf5e13ce7@h…
Fixes: b2a4df200d57 ("KEYS: Expand the capacity of a keyring")
Reported-by: syzbot+5b415c07907a2990d1a3(a)syzkaller.appspotmail.com
Signed-off-by: Chen Ridong <chenridong(a)huawei.com>
Signed-off-by: Yi Yang <yiyang13(a)huawei.com>
---
security/keys/keyring.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/security/keys/keyring.c b/security/keys/keyring.c
index 14abfe765b7e..700409d815a9 100644
--- a/security/keys/keyring.c
+++ b/security/keys/keyring.c
@@ -772,7 +772,9 @@ static bool search_nested_keyrings(struct key *keyring,
for (; slot < ASSOC_ARRAY_FAN_OUT; slot++) {
ptr = READ_ONCE(node->slots[slot]);
- if (assoc_array_ptr_is_meta(ptr) && node->back_pointer)
+ if (assoc_array_ptr_is_meta(ptr) &&
+ (node->back_pointer ||
+ assoc_array_ptr_is_shortcut(ptr)))
goto descend_to_node;
if (!keyring_ptr_is_keyring(ptr))
--
2.25.1
From: Chen Ridong <chenridong(a)huawei.com>
Offering: HULK
hulk inclusion
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/IAU173
--------------------------------
The following bug was triggered when performing syzkaller test:
BUG: KASAN: slab-out-of-bounds in __kuid_val include/linux/uidgid.h:36
BUG: KASAN: slab-out-of-bounds in uid_eq include/linux/uidgid.h:63 [inline]
BUG: KASAN: slab-out-of-bounds in key_task_permission+0x394/0x410
security/keys/permission.c:54
Read of size 4 at addr ffff88813c3ab618 by task stress-ng/4362
CPU: 2 PID: 4362 Comm: stress-ng Not tainted 5.10.0-14930-gafbffd6c3ede #15
Call Trace:
__dump_stack lib/dump_stack.c:82 [inline]
dump_stack+0x107/0x167 lib/dump_stack.c:123
print_address_description.constprop.0+0x19/0x170 mm/kasan/report.c:400
__kasan_report.cold+0x6c/0x84 mm/kasan/report.c:560
kasan_report+0x3a/0x50 mm/kasan/report.c:585
__kuid_val include/linux/uidgid.h:36 [inline]
uid_eq include/linux/uidgid.h:63 [inline]
key_task_permission+0x394/0x410 security/keys/permission.c:54
search_nested_keyrings+0x90e/0xe90 security/keys/keyring.c:793
keyring_search_rcu+0x1b6/0x310 security/keys/keyring.c:922
search_cred_keyrings_rcu+0x111/0x2e0 security/keys/process_keys.c:459
search_process_keyrings_rcu+0x1d/0x310 security/keys/process_keys.c:544
lookup_user_key+0x782/0x12e0 security/keys/process_keys.c:762
keyctl_invalidate_key+0x20/0x190 security/keys/keyctl.c:434
__do_sys_keyctl security/keys/keyctl.c:1978 [inline]
__se_sys_keyctl+0x1de/0x5b0 security/keys/keyctl.c:1880
do_syscall_64+0x30/0x40 arch/x86/entry/common.c:46
entry_SYSCALL_64_after_hwframe+0x67/0xd1
This issue was also reported by syzbot [1].
It can be reproduced by following these steps(more details [2]):
1.Obtain more than 32 inputs that have similar hashes, which end with the
pattern '0xxxxxxxe6'.
2.Reboot and add the keys obtained in step 1.
The reproducer demonstrates how this issue happened:
1.In the search_nested_keyrings function, when it iterates through the
slots in a node(below tag ascend_to_node), and the slot pointer is meta
and node->back_pointer != NULL, it will proceed to descend_to_node.
However, there is an exception. If node is the root, and one of the
slots points to a shortcut, it will be treated as a keyring.
2.Whether the ptr is keyring decided by keyring_ptr_is_keyring function.
However, KEYRING_PTR_SUBTYPE is 0x2UL, the same as
ASSOC_ARRAY_PTR_SUBTYPE_MASK.
3.When 32 keys with the similar hashes are added to the tree, the ROOT has
keys with hashes that are not similar (e.g. slot 0) and it splits NODE
A without using a shortcut. When NODE A is filled with keys that all
hashes are xxe6, the keys are similar, NODE A will split with a shortcut.
Finally, it forms the tree as shown below, where slot 6 points to a
shortcut.
NODE A
+------>+---+
ROOT | | 0 | xxe6
+---+ | +---+
xxxx | 0 | shortcut : : xxe6
+---+ | +---+
xxe6 : : | | | xxe6
+---+ | +---+
| 6 |---+ : : xxe6
+---+ +---+
xxe6 : : | f | xxe6
+---+ +---+
xxe6 | f |
+---+
4.As mentioned above, If a slot(slot 6) of the root points to a shortcut,
it may be mistakenly be transferred to a key*, leading to an read
out-of-bounds read.
To fix this issue, one should jump to descend_to_node if the pointer is a
shortcut.
[1] https://lore.kernel.org/all/000000000000cbb7860611f61147@google.com/T/
[2] https://lore.kernel.org/linux-kernel/1cfa878e-8c7b-4570-8606-21daf5e13ce7@h…
Fixes: b2a4df200d57 ("KEYS: Expand the capacity of a keyring")
Reported-by: syzbot+5b415c07907a2990d1a3(a)syzkaller.appspotmail.com
Signed-off-by: Chen Ridong <chenridong(a)huawei.com>
Signed-off-by: Yi Yang <yiyang13(a)huawei.com>
---
security/keys/keyring.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/security/keys/keyring.c b/security/keys/keyring.c
index e8f2366021ea..8a6d891be55e 100644
--- a/security/keys/keyring.c
+++ b/security/keys/keyring.c
@@ -739,7 +739,9 @@ static bool search_nested_keyrings(struct key *keyring,
for (; slot < ASSOC_ARRAY_FAN_OUT; slot++) {
ptr = READ_ONCE(node->slots[slot]);
- if (assoc_array_ptr_is_meta(ptr) && node->back_pointer)
+ if (assoc_array_ptr_is_meta(ptr) &&
+ (node->back_pointer ||
+ assoc_array_ptr_is_shortcut(ptr)))
goto descend_to_node;
if (!keyring_ptr_is_keyring(ptr))
--
2.25.1
From: Chen Ridong <chenridong(a)huawei.com>
Offering: HULK
hulk inclusion
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/IAU173
--------------------------------
The following bug was triggered when performing syzkaller test:
BUG: KASAN: slab-out-of-bounds in __kuid_val include/linux/uidgid.h:36
BUG: KASAN: slab-out-of-bounds in uid_eq include/linux/uidgid.h:63 [inline]
BUG: KASAN: slab-out-of-bounds in key_task_permission+0x394/0x410
security/keys/permission.c:54
Read of size 4 at addr ffff88813c3ab618 by task stress-ng/4362
CPU: 2 PID: 4362 Comm: stress-ng Not tainted 5.10.0-14930-gafbffd6c3ede #15
Call Trace:
__dump_stack lib/dump_stack.c:82 [inline]
dump_stack+0x107/0x167 lib/dump_stack.c:123
print_address_description.constprop.0+0x19/0x170 mm/kasan/report.c:400
__kasan_report.cold+0x6c/0x84 mm/kasan/report.c:560
kasan_report+0x3a/0x50 mm/kasan/report.c:585
__kuid_val include/linux/uidgid.h:36 [inline]
uid_eq include/linux/uidgid.h:63 [inline]
key_task_permission+0x394/0x410 security/keys/permission.c:54
search_nested_keyrings+0x90e/0xe90 security/keys/keyring.c:793
keyring_search_rcu+0x1b6/0x310 security/keys/keyring.c:922
search_cred_keyrings_rcu+0x111/0x2e0 security/keys/process_keys.c:459
search_process_keyrings_rcu+0x1d/0x310 security/keys/process_keys.c:544
lookup_user_key+0x782/0x12e0 security/keys/process_keys.c:762
keyctl_invalidate_key+0x20/0x190 security/keys/keyctl.c:434
__do_sys_keyctl security/keys/keyctl.c:1978 [inline]
__se_sys_keyctl+0x1de/0x5b0 security/keys/keyctl.c:1880
do_syscall_64+0x30/0x40 arch/x86/entry/common.c:46
entry_SYSCALL_64_after_hwframe+0x67/0xd1
This issue was also reported by syzbot [1].
It can be reproduced by following these steps(more details [2]):
1.Obtain more than 32 inputs that have similar hashes, which end with the
pattern '0xxxxxxxe6'.
2.Reboot and add the keys obtained in step 1.
The reproducer demonstrates how this issue happened:
1.In the search_nested_keyrings function, when it iterates through the
slots in a node(below tag ascend_to_node), and the slot pointer is meta
and node->back_pointer != NULL, it will proceed to descend_to_node.
However, there is an exception. If node is the root, and one of the
slots points to a shortcut, it will be treated as a keyring.
2.Whether the ptr is keyring decided by keyring_ptr_is_keyring function.
However, KEYRING_PTR_SUBTYPE is 0x2UL, the same as
ASSOC_ARRAY_PTR_SUBTYPE_MASK.
3.When 32 keys with the similar hashes are added to the tree, the ROOT has
keys with hashes that are not similar (e.g. slot 0) and it splits NODE
A without using a shortcut. When NODE A is filled with keys that all
hashes are xxe6, the keys are similar, NODE A will split with a shortcut.
Finally, it forms the tree as shown below, where slot 6 points to a
shortcut.
NODE A
+------>+---+
ROOT | | 0 | xxe6
+---+ | +---+
xxxx | 0 | shortcut : : xxe6
+---+ | +---+
xxe6 : : | | | xxe6
+---+ | +---+
| 6 |---+ : : xxe6
+---+ +---+
xxe6 : : | f | xxe6
+---+ +---+
xxe6 | f |
+---+
4.As mentioned above, If a slot(slot 6) of the root points to a shortcut,
it may be mistakenly be transferred to a key*, leading to an read
out-of-bounds read.
To fix this issue, one should jump to descend_to_node if the pointer is a
shortcut.
[1] https://lore.kernel.org/all/000000000000cbb7860611f61147@google.com/T/
[2] https://lore.kernel.org/linux-kernel/1cfa878e-8c7b-4570-8606-21daf5e13ce7@h…
Fixes: b2a4df200d57 ("KEYS: Expand the capacity of a keyring")
Reported-by: syzbot+5b415c07907a2990d1a3(a)syzkaller.appspotmail.com
Signed-off-by: Chen Ridong <chenridong(a)huawei.com>
Signed-off-by: Yi Yang <yiyang13(a)huawei.com>
---
security/keys/keyring.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/security/keys/keyring.c b/security/keys/keyring.c
index e8f2366021ea..8a6d891be55e 100644
--- a/security/keys/keyring.c
+++ b/security/keys/keyring.c
@@ -739,7 +739,9 @@ static bool search_nested_keyrings(struct key *keyring,
for (; slot < ASSOC_ARRAY_FAN_OUT; slot++) {
ptr = READ_ONCE(node->slots[slot]);
- if (assoc_array_ptr_is_meta(ptr) && node->back_pointer)
+ if (assoc_array_ptr_is_meta(ptr) &&
+ (node->back_pointer ||
+ assoc_array_ptr_is_shortcut(ptr)))
goto descend_to_node;
if (!keyring_ptr_is_keyring(ptr))
--
2.25.1