@@ -17,8 +17,8 @@ use starnix_core::mm::{
1717} ;
1818use starnix_core:: mutable_state:: Guard ;
1919use starnix_core:: task:: {
20- CurrentTask , CurrentTaskAndLocked , EventHandler , Kernel , SchedulerState , SimpleWaiter , Task ,
21- ThreadGroupKey , WaitCanceler , WaitQueue , Waiter ,
20+ CurrentTask , CurrentTaskAndLocked , EventHandler , FullCredentials , Kernel , SchedulerState ,
21+ SimpleWaiter , Task , ThreadGroupKey , WaitCanceler , WaitQueue , Waiter ,
2222} ;
2323use starnix_core:: vfs:: buffers:: { InputBuffer , OutputBuffer , VecInputBuffer } ;
2424use starnix_core:: vfs:: pseudo:: simple_file:: BytesFile ;
@@ -3229,6 +3229,7 @@ fn get_resource_accessor<'a>(
32293229struct RemoteResourceAccessor {
32303230 process : zx:: Process ,
32313231 process_accessor : fbinder:: ProcessAccessorSynchronousProxy ,
3232+ remote_creds : FullCredentials ,
32323233}
32333234
32343235impl RemoteResourceAccessor {
@@ -3242,6 +3243,13 @@ impl RemoteResourceAccessor {
32423243 . map_err ( |_| errno ! ( ENOENT ) ) ?;
32433244 result. map_err ( |e| errno_from_code ! ( e. into_primitive( ) as i16 ) )
32443245 }
3246+
3247+ fn with_remote_creds < F , T > ( & self , current_task : & CurrentTask , f : F ) -> Result < T , Errno >
3248+ where
3249+ F : FnOnce ( ) -> Result < T , Errno > ,
3250+ {
3251+ current_task. override_creds ( |temp_creds| * temp_creds = self . remote_creds . clone ( ) , f)
3252+ }
32453253}
32463254
32473255impl std:: fmt:: Debug for RemoteResourceAccessor {
@@ -3406,28 +3414,30 @@ impl ResourceAccessor for RemoteResourceAccessor {
34063414 let num_fds = fds. len ( ) ;
34073415 let mut files = Vec :: with_capacity ( num_fds) ;
34083416
3409- for chunk in fds. chunks ( fbinder:: MAX_REQUEST_COUNT as usize ) {
3410- let response = self . run_file_request ( fbinder:: FileRequest {
3411- get_requests : Some ( chunk. into_iter ( ) . map ( |fd| fd. raw ( ) ) . collect ( ) ) ,
3412- ..Default :: default ( )
3413- } ) ?;
3414- for fbinder:: FileHandle { file, flags, .. } in
3415- response. get_responses . into_iter ( ) . flatten ( )
3416- {
3417- let Some ( flags) = flags else {
3418- log_warn ! ( "Incorrect response to file request. Missing flags." ) ;
3419- return error ! ( ENOENT ) ;
3420- } ;
3421- let file = if let Some ( file) = file {
3422- new_remote_file ( locked, current_task, file, flags. into_fidl ( ) ) ?
3423- } else {
3424- new_null_file ( locked, current_task, flags. into_fidl ( ) )
3425- } ;
3426- files. push ( ( file, FdFlags :: empty ( ) ) ) ;
3417+ self . with_remote_creds ( current_task, || {
3418+ for chunk in fds. chunks ( fbinder:: MAX_REQUEST_COUNT as usize ) {
3419+ let response = self . run_file_request ( fbinder:: FileRequest {
3420+ get_requests : Some ( chunk. into_iter ( ) . map ( |fd| fd. raw ( ) ) . collect ( ) ) ,
3421+ ..Default :: default ( )
3422+ } ) ?;
3423+ for fbinder:: FileHandle { file, flags, .. } in
3424+ response. get_responses . into_iter ( ) . flatten ( )
3425+ {
3426+ let Some ( flags) = flags else {
3427+ log_warn ! ( "Incorrect response to file request. Missing flags." ) ;
3428+ return error ! ( ENOENT ) ;
3429+ } ;
3430+ let file = if let Some ( file) = file {
3431+ new_remote_file ( locked, current_task, file, flags. into_fidl ( ) ) ?
3432+ } else {
3433+ new_null_file ( locked, current_task, flags. into_fidl ( ) )
3434+ } ;
3435+ files. push ( ( file, FdFlags :: empty ( ) ) ) ;
3436+ }
34273437 }
3428- }
34293438
3430- if files. len ( ) != num_fds { error ! ( ENOENT ) } else { Ok ( files) }
3439+ if files. len ( ) != num_fds { error ! ( ENOENT ) } else { Ok ( files) }
3440+ } )
34313441 }
34323442
34333443 fn add_files_with_flags (
@@ -3441,27 +3451,30 @@ impl ResourceAccessor for RemoteResourceAccessor {
34413451 let num_files = files. len ( ) ;
34423452 let mut fds = Vec :: with_capacity ( num_files) ;
34433453
3444- for chunk in files. chunks ( fbinder:: MAX_REQUEST_COUNT as usize ) {
3445- let mut handles = Vec :: with_capacity ( chunk. len ( ) ) ;
3446- for ( file, _) in chunk. into_iter ( ) {
3447- handles. push ( fbinder:: FileHandle {
3448- file : file. to_handle ( current_task) ?,
3449- flags : Some ( file. flags ( ) . into_fidl ( ) ) ,
3450- ..fbinder:: FileHandle :: default ( )
3451- } ) ;
3452- }
3453- let response = self . run_file_request ( fbinder:: FileRequest {
3454- add_requests : Some ( handles) ,
3455- ..Default :: default ( )
3456- } ) ?;
3457- for fd in response. add_responses . into_iter ( ) . flatten ( ) . map ( |fd| FdNumber :: from_raw ( fd) )
3458- {
3459- add_action ( fd) ;
3460- fds. push ( fd) ;
3454+ self . with_remote_creds ( current_task, || {
3455+ for chunk in files. chunks ( fbinder:: MAX_REQUEST_COUNT as usize ) {
3456+ let mut handles = Vec :: with_capacity ( chunk. len ( ) ) ;
3457+ for ( file, _) in chunk. into_iter ( ) {
3458+ handles. push ( fbinder:: FileHandle {
3459+ file : file. to_handle ( current_task) ?,
3460+ flags : Some ( file. flags ( ) . into_fidl ( ) ) ,
3461+ ..fbinder:: FileHandle :: default ( )
3462+ } ) ;
3463+ }
3464+ let response = self . run_file_request ( fbinder:: FileRequest {
3465+ add_requests : Some ( handles) ,
3466+ ..Default :: default ( )
3467+ } ) ?;
3468+ for fd in
3469+ response. add_responses . into_iter ( ) . flatten ( ) . map ( |fd| FdNumber :: from_raw ( fd) )
3470+ {
3471+ add_action ( fd) ;
3472+ fds. push ( fd) ;
3473+ }
34613474 }
3462- }
34633475
3464- if fds. len ( ) != num_files { error ! ( ENOENT ) } else { Ok ( fds) }
3476+ if fds. len ( ) != num_files { error ! ( ENOENT ) } else { Ok ( fds) }
3477+ } )
34653478 }
34663479
34673480 fn as_memory_accessor ( & self ) -> Option < & dyn MemoryAccessor > {
@@ -3678,7 +3691,11 @@ impl BinderDriver {
36783691 fbinder:: ProcessAccessorSynchronousProxy :: new ( process_accessor. into_channel ( ) ) ;
36793692 let identifier = this. create_remote_process (
36803693 current_task. thread_group_key . clone ( ) ,
3681- RemoteResourceAccessor { process_accessor, process } ,
3694+ RemoteResourceAccessor {
3695+ process_accessor,
3696+ process,
3697+ remote_creds : current_task. full_current_creds ( ) ,
3698+ } ,
36823699 ) ;
36833700 Arc :: new ( RemoteBinderConnection {
36843701 binder_connection : BinderConnection {
@@ -9661,7 +9678,9 @@ pub mod tests {
96619678 let process = fuchsia_runtime:: process_self ( )
96629679 . duplicate ( zx:: Rights :: SAME_RIGHTS )
96639680 . expect ( "process" ) ;
9664- let remote_binder_task = Arc :: new ( RemoteResourceAccessor { process_accessor, process } ) ;
9681+ let remote_creds = FullCredentials :: for_kernel ( ) ;
9682+ let remote_binder_task =
9683+ Arc :: new ( RemoteResourceAccessor { process_accessor, process, remote_creds } ) ;
96659684 let mut vector = Vec :: with_capacity ( vector_size) ;
96669685 for i in 0 ..vector_size {
96679686 vector. push ( ( i & 255 ) as u8 ) ;
0 commit comments