Re: [PATCH v2 2/3] keys: make keyring key-chunk byte order agree with keyring_diff_objects()

From: Jarkko Sakkinen

Date: Sat Jul 18 2026 - 14:37:28 EST


On Tue, Jul 14, 2026 at 07:54:50AM -0400, Michael Bommarito wrote:
> keyring_get_key_chunk() loads description bytes into the index chunk low
> address first, while keyring_diff_objects() numbers the first differing
> bit from the low end and folds the absolute byte index into the level
> without removing the inline-prefix offset the level already carries.
> The two disagree on byte order and bit position, so the array can be
> told two keys first differ at a bit that does not differ in the chunk
> the walker uses, letting crafted descriptions collide into one node.
>
> Load the chunk in the order keyring_diff_objects() assumes and drop the
> inline-prefix length when folding the byte index into the level. This
> only changes the in-memory ordering used to place keys within a keyring;
> add, search and read of non-colliding keys are unaffected.
>
> Fixes: f771fde82051 ("keys: Simplify key description management")
> Assisted-by: Claude:claude-opus-4-8
> Signed-off-by: Michael Bommarito <michael.bommarito@xxxxxxxxx>
> ---
> security/keys/keyring.c | 5 +++--
> 1 file changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/security/keys/keyring.c b/security/keys/keyring.c
> index 1739373172ad5..e7066893e6ffc 100644
> --- a/security/keys/keyring.c
> +++ b/security/keys/keyring.c
> @@ -292,9 +292,10 @@ static unsigned long keyring_get_key_chunk(const void *data, int level)
> desc_len -= offset;
> if (desc_len > n)
> desc_len = n;
> + d += desc_len;
> do {
> chunk <<= 8;
> - chunk |= *d++;
> + chunk |= *--d;
> } while (--desc_len > 0);
> return chunk;
> }
> @@ -375,7 +376,7 @@ static int keyring_diff_objects(const void *object, const void *data)
> return -1;
>
> differ_plus_i:
> - level += i;
> + level += i - (int)sizeof(a->desc);
> differ:
> i = level * 8 + __ffs(seg_a ^ seg_b);
> return i;
> --
> 2.53.0
>


Reviewed-by: Jarkko Sakkinen <jarkko@xxxxxxxxxx>

BR, Jarkko