Skip to content

Commit 814a601

Browse files
committed
[wasm_split] Fix crash when manifest starts with a blank line
When the first line of the manifest file is blank, currFuncs is null, but will be dereferenced to check if the current module will be empty. This CL fixes that and also cleans up the logic to clarify how the state machine works.
1 parent 0b8d88e commit 814a601

1 file changed

Lines changed: 27 additions & 28 deletions

File tree

‎src/tools/wasm-split/wasm-split.cpp‎

Lines changed: 27 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -424,42 +424,41 @@ void multiSplitModule(const WasmSplitOptions& options) {
424424
bool newSection = true;
425425
std::unordered_set<Name> moduleNameSet;
426426
while (std::getline(manifest, line)) {
427-
if (line.empty()) {
428-
newSection = true;
429-
if (currFuncs->empty() && !options.quiet) {
430-
std::cerr << "warning: Module " << currModule << " will be empty\n";
431-
}
432-
continue;
433-
}
434-
Name name = line;
435427
if (newSection) {
436-
if (name.endsWith(":")) {
437-
name = name.substr(0, name.size() - 1);
438-
if (name.size() == 0) {
439-
Fatal() << "Module name is empty\n";
440-
}
428+
Name moduleName = line;
429+
if (moduleName.endsWith(":")) {
430+
moduleName = moduleName.substr(0, moduleName.size() - 1);
431+
}
432+
if (moduleName.size() == 0) {
433+
Fatal() << "Module name is empty\n";
441434
}
442-
if (moduleNameSet.contains(name)) {
443-
Fatal() << "Module name " << name << " is listed more than once\n";
435+
if (moduleNameSet.contains(moduleName)) {
436+
Fatal() << "Module name " << moduleName
437+
<< " is listed more than once\n";
444438
}
445-
currModule = name;
439+
currModule = moduleName;
446440
moduleNameSet.insert(currModule);
447441
config.secondaryNames.push_back(currModule);
448442
config.secondaryFuncs.emplace_back(std::set<Name>());
449443
currFuncs = &config.secondaryFuncs.back();
450444
newSection = false;
451-
continue;
452-
}
453-
assert(currFuncs);
454-
if (!canSplitFunc(name, wasm, options)) {
455-
continue;
456-
}
457-
currFuncs->insert(name);
458-
auto [it, inserted] = funcModules.insert({name, currModule});
459-
if (!inserted && it->second != currModule) {
460-
Fatal() << "Function " << name << "cannot be assigned to module "
461-
<< currModule << "; it is already assigned to module "
462-
<< it->second << '\n';
445+
} else if (line.empty()) {
446+
newSection = true;
447+
if (currFuncs->empty() && !options.quiet) {
448+
std::cerr << "warning: Module " << currModule << " will be empty\n";
449+
}
450+
} else {
451+
assert(currFuncs);
452+
Name funcName = line;
453+
if (canSplitFunc(funcName, wasm, options)) {
454+
currFuncs->insert(funcName);
455+
auto [it, inserted] = funcModules.insert({funcName, currModule});
456+
if (!inserted && it->second != currModule) {
457+
Fatal() << "Function " << funcName << "cannot be assigned to module "
458+
<< currModule << "; it is already assigned to module "
459+
<< it->second << '\n';
460+
}
461+
}
463462
}
464463
}
465464

0 commit comments

Comments
 (0)