Skip to content
This repository was archived by the owner on Jan 22, 2025. It is now read-only.

Commit 001b10e

Browse files
committed
Fix UB in TokenCell
1 parent d072efd commit 001b10e

File tree

1 file changed

+14
-12
lines changed
  • unified-scheduler-logic/src

1 file changed

+14
-12
lines changed

unified-scheduler-logic/src/lib.rs

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,12 @@ mod utils {
220220
/// instances of [`TokenCell<V>`] conceptually owned by the instance of [`Token<V>`] (a
221221
/// particular thread), unless previous borrow is released. After the release, the used
222222
/// singleton token should be free to be reused for reborrows.
223-
pub(super) fn borrow_mut<'t>(&self, _token: &'t mut Token<V>) -> &'t mut V {
223+
///
224+
/// Note that the returned reference's lifetime is restricted to 'self, not 'token to avoid
225+
/// use-after-free undefined behaviors.
226+
// As it's protected by token, it's okay to suppress this clippy lint
227+
#[allow(clippy::mut_from_ref)]
228+
pub(super) fn borrow_mut(&self, _token: &mut Token<V>) -> &mut V {
224229
unsafe { &mut *self.0.get() }
225230
}
226231
}
@@ -332,10 +337,7 @@ impl TaskInner {
332337
&self.lock_attempts
333338
}
334339

335-
fn blocked_usage_count_mut<'t>(
336-
&self,
337-
token: &'t mut BlockedUsageCountToken,
338-
) -> &'t mut ShortCounter {
340+
fn blocked_usage_count_mut(&self, token: &mut BlockedUsageCountToken) -> &mut ShortCounter {
339341
self.blocked_usage_count.borrow_mut(token)
340342
}
341343

@@ -369,10 +371,7 @@ impl LockAttempt {
369371
}
370372
}
371373

372-
fn usage_queue_mut<'t>(
373-
&self,
374-
usage_queue_token: &'t mut UsageQueueToken,
375-
) -> &'t mut UsageQueueInner {
374+
fn usage_queue_mut(&self, usage_queue_token: &mut UsageQueueToken) -> &mut UsageQueueInner {
376375
self.usage_queue.0.borrow_mut(usage_queue_token)
377376
}
378377
}
@@ -1251,11 +1250,12 @@ mod tests {
12511250
SchedulingStateMachine::exclusively_initialize_current_thread_for_scheduling()
12521251
};
12531252
let usage_queue = UsageQueue::default();
1253+
let usage_queue_for_lock_attempt = UsageQueue::default();
12541254
let _ = SchedulingStateMachine::unlock_usage_queue(
12551255
usage_queue
12561256
.0
12571257
.borrow_mut(&mut state_machine.usage_queue_token),
1258-
&LockAttempt::new(usage_queue, RequestedUsage::Writable),
1258+
&LockAttempt::new(usage_queue_for_lock_attempt, RequestedUsage::Writable),
12591259
);
12601260
}
12611261

@@ -1270,11 +1270,12 @@ mod tests {
12701270
.0
12711271
.borrow_mut(&mut state_machine.usage_queue_token)
12721272
.current_usage = Usage::Writable;
1273+
let usage_queue_for_lock_attempt = UsageQueue::default();
12731274
let _ = SchedulingStateMachine::unlock_usage_queue(
12741275
usage_queue
12751276
.0
12761277
.borrow_mut(&mut state_machine.usage_queue_token),
1277-
&LockAttempt::new(usage_queue, RequestedUsage::Readonly),
1278+
&LockAttempt::new(usage_queue_for_lock_attempt, RequestedUsage::Readonly),
12781279
);
12791280
}
12801281

@@ -1289,11 +1290,12 @@ mod tests {
12891290
.0
12901291
.borrow_mut(&mut state_machine.usage_queue_token)
12911292
.current_usage = Usage::Readonly(ShortCounter::one());
1293+
let usage_queue_for_lock_attempt = UsageQueue::default();
12921294
let _ = SchedulingStateMachine::unlock_usage_queue(
12931295
usage_queue
12941296
.0
12951297
.borrow_mut(&mut state_machine.usage_queue_token),
1296-
&LockAttempt::new(usage_queue, RequestedUsage::Writable),
1298+
&LockAttempt::new(usage_queue_for_lock_attempt, RequestedUsage::Writable),
12971299
);
12981300
}
12991301
}

0 commit comments

Comments
 (0)