summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCarlos Llamas <cmllamas@google.com>2024-03-30 19:01:14 +0000
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2024-04-27 17:07:13 +0200
commita6d2a8b211c874971ee4cf3ddd167408177f6e76 (patch)
treea39760b4834f8357c2b63d525c60ec98d6411769
parentd05380576fb42adb427b1d5dd11f09fe33833b1a (diff)
downloadlinux-stable-a6d2a8b211c874971ee4cf3ddd167408177f6e76.tar.gz
linux-stable-a6d2a8b211c874971ee4cf3ddd167408177f6e76.tar.bz2
linux-stable-a6d2a8b211c874971ee4cf3ddd167408177f6e76.zip
binder: check offset alignment in binder_get_object()
commit aaef73821a3b0194a01bd23ca77774f704a04d40 upstream. 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: stable@vger.kernel.org Signed-off-by: Carlos Llamas <cmllamas@google.com> Acked-by: Todd Kjos <tkjos@google.com> Link: https://lore.kernel.org/r/20240330190115.1877819-1-cmllamas@google.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/android/binder.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/android/binder.c b/drivers/android/binder.c
index 55cd17a13e75..8c2b7c074eca 100644
--- a/drivers/android/binder.c
+++ b/drivers/android/binder.c
@@ -1707,8 +1707,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;