Commit Diff


commit - 229963a7d6b2270e522fd60ea3e260e1058dc206
commit + 17f5251efb9a39a888a3bba85867c7d06717ad31
blob - 44f81447a39b7fa4ac7dd4fd7e6f95dcb076a91b
blob + 92b6b8bdef3aab615a0fb54ab9f92483f90481a1
--- test/fuzz/luaL_loadbuffer/preamble.lua
+++ test/fuzz/luaL_loadbuffer/preamble.lua
@@ -4,6 +4,10 @@ local always_number = function(val)
     return tonumber(val) or DEFAULT_NUMBER
 end
 
+local not_nan_and_nil = function(val)
+    return (val ~= val or val == nil) and DEFAULT_NUMBER or val
+end
+
 local __add = function(v1, v2)
     return always_number(v1) + always_number(v2)
 end
blob - 22fc272c4623152e905f00659345cb747f262e6f
blob + b4500da9cad3d96ed0406836754e3336d1abe269
--- test/fuzz/luaL_loadbuffer/serializer.cc
+++ test/fuzz/luaL_loadbuffer/serializer.cc
@@ -56,6 +56,7 @@ const std::set<std::string> KReservedLuaKeywords {
 const std::string kCounterNamePrefix = "counter_";
 const std::string kNumberWrapperName = "always_number";
 const std::string kBinOpWrapperName = "only_numbers_cmp";
+const std::string kNotNaNAndNilWrapperName = "not_nan_and_nil";
 
 PROTO_TOSTRING(Block, block);
 PROTO_TOSTRING(Chunk, chunk);
@@ -157,6 +158,17 @@ NumberWrappedExpressionToString(const Expression &expr
 	return retval;
 }
 
+std::string
+AllowedIndexExpressionToString(const Expression &expr)
+{
+	std::string retval;
+	retval += kNotNaNAndNilWrapperName;
+	retval += "(";
+	retval += ExpressionToString(expr);
+	retval += ")";
+	return retval;
+}
+
 /**
  * Class that controls id creation for counters. Basically, a
  * variable wrapper that guarantees variable to be incremented.
@@ -1091,8 +1103,9 @@ PROTO_TOSTRING(Field, field)
 
 NESTED_PROTO_TOSTRING(ExpressionAssignment, assignment, Field)
 {
+	/* Prevent error 'table index is nil' and 'table index is NaN'. */
 	std::string assignment_str = "[ " +
-		ExpressionToString(assignment.key()) + " ]";
+		AllowedIndexExpressionToString(assignment.key()) + " ]";
 	assignment_str += " = " + ExpressionToString(assignment.value());
 	return assignment_str;
 }