diff options
| author | 2022-06-17 11:48:05 -0700 | |
|---|---|---|
| committer | 2022-06-17 11:58:58 -0700 | |
| commit | 0c5f923dd68d31482741ca4b44bbec80eef2fe9d (patch) | |
| tree | a017a3bbba130317a27be6a668708fedce7a50aa | |
| parent | d05c0b93659d3880a6c4411e1352c9f1d750f2f1 (diff) | |
libbinder_rs: Handle empty args list for dump transactions
Previously we expected the args pointer passed to the handler for dump
transactions to be non-null. If there are no arguments this
pointer may be null and we should pass an empty args list instead of
erroring out.
Bug: 232887857
Test: atest -p frameworks/native/libs/binder
Test: cts -m CtsSecurityTestCases -t android.security.cts.ServicePermissionsTest#testDumpProtected
Change-Id: If2b08c688a374913ef0913749efc72db07e7776f
| -rw-r--r-- | libs/binder/rust/src/native.rs | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/libs/binder/rust/src/native.rs b/libs/binder/rust/src/native.rs index b7c7ae4b54..3edeebf892 100644 --- a/libs/binder/rust/src/native.rs +++ b/libs/binder/rust/src/native.rs @@ -335,11 +335,16 @@ impl<T: Remotable> InterfaceClassMethods for Binder<T> { // We don't own this file, so we need to be careful not to drop it. let file = ManuallyDrop::new(File::from_raw_fd(fd)); - if args.is_null() { + if args.is_null() && num_args != 0 { return StatusCode::UNEXPECTED_NULL as status_t; } - let args = slice::from_raw_parts(args, num_args as usize); - let args: Vec<_> = args.iter().map(|s| CStr::from_ptr(*s)).collect(); + + let args = if args.is_null() || num_args == 0 { + vec![] + } else { + slice::from_raw_parts(args, num_args as usize) + .iter().map(|s| CStr::from_ptr(*s)).collect() + }; let object = sys::AIBinder_getUserData(binder); let binder: &T = &*(object as *const T); |