Skip to content

Commit 7c23865

Browse files
authored
Merge pull request #312 from wedsonaf/node-flags
binder: Store node flags on creation.
2 parents 82057dd + 85b23ab commit 7c23865

File tree

3 files changed

+19
-7
lines changed

3 files changed

+19
-7
lines changed

drivers/android/node.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,13 +212,14 @@ pub(crate) struct Node {
212212
pub(crate) global_id: u64,
213213
ptr: usize,
214214
cookie: usize,
215+
pub(crate) flags: u32,
215216
pub(crate) owner: Ref<Process>,
216217
inner: LockedBy<NodeInner, Mutex<ProcessInner>>,
217218
links: Links<dyn DeliverToRead>,
218219
}
219220

220221
impl Node {
221-
pub(crate) fn new(ptr: usize, cookie: usize, owner: Ref<Process>) -> Self {
222+
pub(crate) fn new(ptr: usize, cookie: usize, flags: u32, owner: Ref<Process>) -> Self {
222223
static NEXT_ID: AtomicU64 = AtomicU64::new(1);
223224
let inner = LockedBy::new(
224225
&owner.inner,
@@ -232,6 +233,7 @@ impl Node {
232233
global_id: NEXT_ID.fetch_add(1, Ordering::Relaxed),
233234
ptr,
234235
cookie,
236+
flags,
235237
owner,
236238
inner,
237239
links: Links::new(),

drivers/android/process.rs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -367,12 +367,18 @@ impl Process {
367367
}
368368

369369
fn set_as_manager(&self, info: Option<FlatBinderObject>, thread: &Thread) -> Result {
370-
let (ptr, cookie) = if let Some(obj) = info {
371-
(unsafe { obj.__bindgen_anon_1.binder }, obj.cookie)
370+
let (ptr, cookie, flags) = if let Some(obj) = info {
371+
(
372+
// SAFETY: The object type for this ioctl is implicitly `BINDER_TYPE_BINDER`, so it
373+
// is safe to access the `binder` field.
374+
unsafe { obj.__bindgen_anon_1.binder },
375+
obj.cookie,
376+
obj.flags,
377+
)
372378
} else {
373-
(0, 0)
379+
(0, 0, 0)
374380
};
375-
let node_ref = self.get_node(ptr as _, cookie as _, true, Some(thread))?;
381+
let node_ref = self.get_node(ptr as _, cookie as _, flags as _, true, Some(thread))?;
376382
let node = node_ref.node.clone();
377383
self.ctx.set_manager_node(node_ref)?;
378384
self.inner.lock().is_manager = true;
@@ -387,6 +393,7 @@ impl Process {
387393
&self,
388394
ptr: usize,
389395
cookie: usize,
396+
flags: u32,
390397
strong: bool,
391398
thread: Option<&Thread>,
392399
) -> Result<NodeRef> {
@@ -399,7 +406,7 @@ impl Process {
399406
}
400407

401408
// Allocate the node before reacquiring the lock.
402-
let node = Arc::try_new(Node::new(ptr, cookie, Ref::new_from(self)))?;
409+
let node = Arc::try_new(Node::new(ptr, cookie, flags, Ref::new_from(self)))?;
403410

404411
let mut inner = self.inner.lock();
405412
if let Some(node) = inner.get_existing_node_ref(ptr, cookie, strong, thread)? {

drivers/android/thread.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -389,7 +389,10 @@ impl Thread {
389389
// SAFETY: The type is `BINDER_TYPE_{WEAK_}BINDER`, so `binder` is populated.
390390
let ptr = unsafe { obj.__bindgen_anon_1.binder } as _;
391391
let cookie = obj.cookie as _;
392-
Ok(self.process.get_node(ptr, cookie, strong, Some(self))?)
392+
let flags = obj.flags as _;
393+
Ok(self
394+
.process
395+
.get_node(ptr, cookie, flags, strong, Some(self))?)
393396
})?;
394397
}
395398
BINDER_TYPE_WEAK_HANDLE | BINDER_TYPE_HANDLE => {

0 commit comments

Comments
 (0)