Commit Diff


commit - c3c00e1340a896b10848991b4c36b0c11dd5e84e
commit + 229963a7d6b2270e522fd60ea3e260e1058dc206
blob - 100f35ed35d865752c08144198544e300f9adab2
blob + 22fc272c4623152e905f00659345cb747f262e6f
--- test/fuzz/luaL_loadbuffer/serializer.cc
+++ test/fuzz/luaL_loadbuffer/serializer.cc
@@ -25,6 +25,34 @@ extern char preamble_lua[];
 namespace luajit_fuzzer {
 namespace {
 
+/*
+ * The following keywords are reserved and cannot be used as names,
+ * see Lua 5.1 Reference Manual, 2.1 – Lexical Conventions.
+ */
+const std::set<std::string> KReservedLuaKeywords {
+	"and",
+	"break",
+	"do",
+	"else",
+	"elseif",
+	"end",
+	"false",
+	"for",
+	"function",
+	"if",
+	"in",
+	"local",
+	"nil",
+	"not",
+	"or",
+	"repeat",
+	"return",
+	"then",
+	"true",
+	"until",
+	"while",
+};
+
 const std::string kCounterNamePrefix = "counter_";
 const std::string kNumberWrapperName = "always_number";
 const std::string kBinOpWrapperName = "only_numbers_cmp";
@@ -911,7 +939,12 @@ NESTED_PROTO_TOSTRING(IndexWithName, indexname, Variab
 {
 	std::string indexname_str = PrefixExpressionToString(
 		indexname.prefixexp());
-	indexname_str += "." + ConvertToStringDefault(indexname.name());
+	std::string idx_str = ConvertToStringDefault(indexname.name());
+	/* Prevent using reserved keywords as indices. */
+	if (KReservedLuaKeywords.find(idx_str) != KReservedLuaKeywords.end()) {
+		idx_str += "_1";
+	}
+	indexname_str += "." + idx_str;
 	return indexname_str;
 }