summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/c-writer.cc31
1 files changed, 24 insertions, 7 deletions
diff --git a/src/c-writer.cc b/src/c-writer.cc
index 67b3db3c..14a64da2 100644
--- a/src/c-writer.cc
+++ b/src/c-writer.cc
@@ -526,6 +526,22 @@ constexpr char CWriter::MangleField(ModuleFieldType type) {
return 'a' + static_cast<char>(type);
}
+// remove risky characters for pasting into a C-style comment
+static std::string SanitizeForComment(std::string_view str) {
+ std::string result;
+
+ for (const uint8_t ch : str) {
+ // escape control chars, DEL, >7-bit chars, trigraphs, and end of comment
+ if (ch < ' ' || ch > '~' || ch == '?' || ch == '/') {
+ result += "\\" + StringPrintf("%02X", ch);
+ } else {
+ result += ch;
+ }
+ }
+
+ return result;
+}
+
// static
std::string CWriter::MangleMultivalueTypes(const TypeVector& types) {
assert(types.size() >= 2);
@@ -1460,8 +1476,8 @@ void CWriter::BeginInstance() {
continue;
}
- Write("/* import: '", import->module_name, "' '", import->field_name,
- "' */", Newline());
+ Write("/* import: '", SanitizeForComment(import->module_name), "' '",
+ SanitizeForComment(import->field_name), "' */", Newline());
switch (import->kind()) {
case ExternalKind::Global:
@@ -1499,8 +1515,8 @@ void CWriter::WriteImports() {
for (const Import* import : unique_imports_) {
if (import->kind() == ExternalKind::Func) {
- Write("/* import: '", import->module_name, "' '", import->field_name,
- "' */", Newline());
+ Write("/* import: '", SanitizeForComment(import->module_name), "' '",
+ SanitizeForComment(import->field_name), "' */", Newline());
const Func& func = cast<FuncImport>(import)->func;
WriteImportFuncDeclaration(
func.decl, import->module_name,
@@ -1508,8 +1524,8 @@ void CWriter::WriteImports() {
Write(";");
Write(Newline());
} else if (import->kind() == ExternalKind::Tag) {
- Write("/* import: '", import->module_name, "' '", import->field_name,
- "' */", Newline());
+ Write("/* import: '", SanitizeForComment(import->module_name), "' '",
+ SanitizeForComment(import->field_name), "' */", Newline());
Write("extern const wasm_rt_tag_t ",
ExportName(import->module_name, import->field_name), ";",
Newline());
@@ -1924,7 +1940,8 @@ void CWriter::WriteExports(CWriterPhase kind) {
return;
for (const Export* export_ : module_->exports) {
- Write(Newline(), "/* export: '", export_->name, "' */", Newline());
+ Write(Newline(), "/* export: '", SanitizeForComment(export_->name), "' */",
+ Newline());
const std::string mangled_name = ExportName(export_->name);
std::string internal_name;