kaist-cp / rv6

Other
125 stars 13 forks source link

unsoundness in `MruArena` #597

Closed travis1829 closed 2 years ago

travis1829 commented 2 years ago

MruArena내부의 list는 MruArena를 감싸는 SpinLock으로 보호받고 있습니다. 이때, 현재는 ArenaRc::new가 다음과 같이 되어있으므로, ArenaRc가 자신이 allocated되었던 arena가 아닌 엉뚱한 arena를 가리키도록 할 수 있습니다.

pub fn new(arena: StrongPin<'_, A>, inner: Ref<A::Data>) -> Self

이러면 list를 수정하는 과정에서 synchronization이 잘못될 수 있고, 또, alloc와 dealloc이 동시에 일어나면 StrongPinMut<MruArenaInner>>&MruArenaInner가 공존할 수 있을 것 같습니다.

해결 방법은 고민중입니다만, 일단은 ArenaRc::new의 signature를 다시 이전처럼 바꾸면 좋을 것 같습니다.

pub fn new<'id>(arena: ArenaRef<'id, '_, A>, inner: Handle<'id, T>) -> Self