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 17:37:22 +0100
commit49c89f4bf1abf52541e1644b56ceb8a112ed6feb (patch)
tree6eab1ea6c9130b8d5e23ac361cbe57fa45e89c39
parent149ba18604ec71cac89d9c75df322fa9ccd2181f (diff)
downloadcommon-deprecated/android12-5.10-2023-05.tar.gz
FROMLIST: binder: check offset alignment in binder_get_object()deprecated/android12-5.10-2023-05android12-5.10-2023-05
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 Bug: 332642003 Link: https://lore.kernel.org/all/20240330190115.1877819-1-cmllamas@google.com/ Signed-off-by: Carlos Llamas <cmllamas@google.com> Change-Id: Iaddabaa28de7ba7b7d35dbb639d38ca79dbc5077 Bug: 332642003 Signed-off-by: Pindar Yang <pindaryang@google.com> (cherry picked from commit 7859c5c9ebc6b0201ea804078a2329184b58ace5) 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 75072d3bc98c..f49489d6e5c3 100644
--- a/drivers/android/binder.c
+++ b/drivers/android/binder.c
@@ -1799,8 +1799,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;