avm2: Prevent circularly referential scripts from causing stack overflows or double-borrows.

This commit is contained in:
David Wendt 2020-10-08 22:19:59 -04:00 committed by Mike Welsh
parent a484861f79
commit 50d6ffb510
1 changed files with 11 additions and 7 deletions

View File

@ -347,11 +347,16 @@ impl<'gc> Script<'gc> {
&mut self,
context: &mut UpdateContext<'_, 'gc, '_>,
) -> Result<Object<'gc>, Error> {
if !self.0.read().initialized {
let mut globals = self.0.read().globals;
let mut write = self.0.write(context.gc_context);
if !write.initialized {
write.initialized = true;
let mut globals = write.globals;
let scope = Scope::push_scope(None, globals, context.gc_context);
let mut null_activation = Activation::from_nothing(context.reborrow());
drop(write);
for trait_entry in self.traits()?.iter() {
globals.install_foreign_trait(
&mut null_activation,
@ -362,12 +367,11 @@ impl<'gc> Script<'gc> {
}
Avm2::run_script_initializer(*self, context)?;
Ok(globals)
} else {
Ok(write.globals)
}
let mut write = self.0.write(context.gc_context);
write.initialized = true;
Ok(write.globals)
}
/// Return traits for this script.