diff --git a/drivers/staging/android/binder.c b/drivers/staging/android/binder.c index d3b2695dce3..0e2d05daca6 100644 --- a/drivers/staging/android/binder.c +++ b/drivers/staging/android/binder.c @@ -2148,6 +2148,7 @@ static void binder_transaction(struct binder_proc *proc, if (target_node && target_node->txn_security_ctx) { u32 secid; + size_t added_size; security_task_getsecid(proc->tsk, &secid); ret = security_secid_to_secctx(secid, &secctx, &secctx_sz); @@ -2155,7 +2156,13 @@ static void binder_transaction(struct binder_proc *proc, return_error = BR_FAILED_REPLY; goto err_get_secctx_failed; } - extra_buffers_size += ALIGN(secctx_sz, sizeof(u64)); + added_size = ALIGN(secctx_sz, sizeof(u64)); + extra_buffers_size += added_size; + if (extra_buffers_size < added_size) { + /* integer overflow of extra_buffers_size */ + return_error = BR_FAILED_REPLY; + goto err_bad_extra_size; + } } trace_binder_transaction(reply, t, target_node); @@ -2384,6 +2391,7 @@ err_copy_data_failed: t->buffer->transaction = NULL; binder_free_buf(target_proc, t->buffer); err_binder_alloc_buf_failed: +err_bad_extra_size: if (secctx) security_release_secctx(secctx, secctx_sz); err_get_secctx_failed: