]> Git Repo - J-linux.git/commitdiff
binder: check offset alignment in binder_get_object()
authorCarlos Llamas <[email protected]>
Sat, 30 Mar 2024 19:01:14 +0000 (19:01 +0000)
committerGreg Kroah-Hartman <[email protected]>
Thu, 11 Apr 2024 13:19:12 +0000 (15:19 +0200)
Commit 6d98eb95b450 ("binder: avoid potential data leakage when copying
txn") introduced changes to how binder objects are copied. In doing so,
it unintentionally removed an offset alignment check done through calls
to binder_alloc_copy_from_buffer() -> check_buffer().

These calls were replaced in binder_get_object() with copy_from_user(),
so now an explicit offset alignment check is needed here. This avoids
later complications when unwinding the objects gets harder.

It is worth noting this check existed prior to commit 7a67a39320df
("binder: add function to copy binder object from buffer"), likely
removed due to redundancy at the time.

Fixes: 6d98eb95b450 ("binder: avoid potential data leakage when copying txn")
Cc: [email protected]
Signed-off-by: Carlos Llamas <[email protected]>
Acked-by: Todd Kjos <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Greg Kroah-Hartman <[email protected]>
drivers/android/binder.c

index bad28cf42010415bee522cb2f778bd866a756584..dd6923d37931f9565dac0a112458a885568a4253 100644 (file)
@@ -1708,8 +1708,10 @@ static size_t binder_get_object(struct binder_proc *proc,
        size_t object_size = 0;
 
        read_size = min_t(size_t, sizeof(*object), buffer->data_size - offset);
-       if (offset > buffer->data_size || read_size < sizeof(*hdr))
+       if (offset > buffer->data_size || read_size < sizeof(*hdr) ||
+           !IS_ALIGNED(offset, sizeof(u32)))
                return 0;
+
        if (u) {
                if (copy_from_user(object, u + offset, read_size))
                        return 0;
This page took 0.060739 seconds and 4 git commands to generate.