From 5188a0e29c0ac6854366db441a9e9234ee6e1368 Mon Sep 17 00:00:00 2001 From: Sergey Pepyakin Date: Wed, 7 Feb 2018 15:58:31 +0300 Subject: [PATCH] Validate duplicate exports. --- src/validation/mod.rs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/validation/mod.rs b/src/validation/mod.rs index 1836791..715f08e 100644 --- a/src/validation/mod.rs +++ b/src/validation/mod.rs @@ -1,6 +1,6 @@ use std::error; use std::fmt; -use std::collections::HashMap; +use std::collections::{HashMap, HashSet}; use parity_wasm::elements::{ BlockType, External, GlobalEntry, GlobalType, Internal, MemoryType, Module, Opcode, ResizableLimits, TableType, ValueType, InitExpr, Type @@ -163,7 +163,15 @@ pub fn validate_module(module: Module) -> Result { // validate export section if let Some(export_section) = module.export_section() { + let mut export_names = HashSet::new(); for export in export_section.entries() { + // HashSet::insert returns false if item already in set. + let duplicate = export_names.insert(export.field()) == false; + if duplicate { + return Err(Error( + format!("duplicate export {}", export.field()), + )); + } match *export.internal() { Internal::Function(function_index) => { context.require_function(function_index)?;