summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Llamas <cmllamas@google.com>2024-03-30 19:01:14 +0000
committerLee Jones <joneslee@google.com>2024-04-18 12:13:30 +0100
commit1bbb29f87f4214c73882960a0db51d7773e50c83 (patch)
treee42f58f227aec3c3ce1f65b653ab430c2c4c1802
parentc3eb21f4b216ebd927e063d3570606367141c564 (diff)
downloadcommon-deprecated/android14-5.15-2023-06.tar.gz
FROMLIST: binder: check offset alignment in binder_get_object()deprecated/android14-5.15-2023-06android14-5.15-2023-06
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> Acked-by: Todd Kjos <tkjos@google.com> Signed-off-by: Carlos Llamas <cmllamas@google.com> Bug: 320661088 Link: https://lore.kernel.org/all/20240330190115.1877819-1-cmllamas@google.com/ Signed-off-by: Carlos Llamas <cmllamas@google.com> Change-Id: Iaddabaa28de7ba7b7d35dbb639d38ca79dbc5077 (cherry picked from commit 0c9784b747c6a960e5b922e9ccff382db1b73ce4) Signed-off-by: Lee Jones <joneslee@google.com>
-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 c959eb9835b0..213b6290eb19 100644
--- a/drivers/android/binder.c
+++ b/drivers/android/binder.c
@@ -1914,8 +1914,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;