diff --git a/crates/wasmparser/src/validator/component.rs b/crates/wasmparser/src/validator/component.rs index 1e9441035b..8111d48fae 100644 --- a/crates/wasmparser/src/validator/component.rs +++ b/crates/wasmparser/src/validator/component.rs @@ -2446,29 +2446,42 @@ impl ComponentState { types: &mut TypeAlloc, offset: usize, ) -> Result<()> { + let component = components.last_mut().unwrap(); + + match component.kind { + // For a component itself all alias kind are allowed. + ComponentKind::Component => {} + + // For instance/component types only aliases to `type` or `instance` + // items are allowed, and all other aliases are rejected. + ComponentKind::InstanceType | ComponentKind::ComponentType => match &alias { + crate::ComponentAlias::InstanceExport { + kind: ComponentExternalKind::Type | ComponentExternalKind::Instance, + .. + } + | crate::ComponentAlias::Outer { + kind: ComponentOuterAliasKind::Type | ComponentOuterAliasKind::CoreType, + .. + } => {} + + _ => bail!( + offset, + "aliases in a component or instance type may only refer to types or instances" + ), + }, + } + match alias { crate::ComponentAlias::InstanceExport { instance_index, kind, name, - } => components.last_mut().unwrap().alias_instance_export( - instance_index, - kind, - name, - types, - offset, - ), + } => component.alias_instance_export(instance_index, kind, name, types, offset), crate::ComponentAlias::CoreInstanceExport { instance_index, kind, name, - } => components.last_mut().unwrap().alias_core_instance_export( - instance_index, - kind, - name, - types, - offset, - ), + } => component.alias_core_instance_export(instance_index, kind, name, types, offset), crate::ComponentAlias::Outer { kind, count, index } => match kind { ComponentOuterAliasKind::CoreModule => { Self::alias_module(components, count, index, offset) diff --git a/tests/cli/component-model/alias.wast b/tests/cli/component-model/alias.wast index dd9d1b37a1..86ad3f92c8 100644 --- a/tests/cli/component-model/alias.wast +++ b/tests/cli/component-model/alias.wast @@ -299,3 +299,12 @@ (instance (instantiate (component $i "x"))) ) ) + +(assert_invalid + (component + (type (component + (import "x" (instance $I (export "f" (func)))) + (alias export $I "f" (func)) + )) + ) + "aliases in a component or instance type may only refer to types or instances") diff --git a/tests/snapshots/cli/component-model/alias.wast.json b/tests/snapshots/cli/component-model/alias.wast.json index 7499b446ee..b2e134ce78 100644 --- a/tests/snapshots/cli/component-model/alias.wast.json +++ b/tests/snapshots/cli/component-model/alias.wast.json @@ -183,6 +183,13 @@ "line": 293, "filename": "alias.27.wasm", "module_type": "binary" + }, + { + "type": "assert_invalid", + "line": 304, + "filename": "alias.28.wasm", + "module_type": "binary", + "text": "aliases in a component or instance type may only refer to types or instances" } ] } \ No newline at end of file