Skip to content

Commit 4466c14

Browse files
committed
Buffer management bug fix. Fixes #3.
1 parent 146db4e commit 4466c14

File tree

2 files changed

+28
-2
lines changed

2 files changed

+28
-2
lines changed

Luaon.NET/LuaTableTextReader.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -228,18 +228,20 @@ private bool EnsureBuffer(int length = 0)
228228
{
229229
// Shift unread chars to the left; reduce buffer length.
230230
Array.Copy(buffer, bufferPos, buffer, 0, bufferLength - bufferPos);
231-
bufferLength = bufferLength - bufferPos;
231+
bufferLength -= bufferPos;
232232
bufferPos = 0;
233233
}
234234
// Read from where the current loaded buffer ends.
235235
var charsRead = Reader.ReadBlock(buffer, bufferLength, charsNeeded);
236236
bufferLength += charsRead;
237237
if (charsRead < charsNeeded)
238238
{
239+
// Reader must have reached EOF.
240+
Debug.Assert(Reader.Peek() < 0);
239241
readerEof = true;
240242
return false;
241243
}
242-
return false;
244+
return true;
243245
}
244246

245247
private bool LookAhead(char c)

XUnitTestProject1/Tests/RegressionTests.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,5 +35,29 @@ public void Issue1(string seed, int repeat)
3535
Assert.Equal(bigTable.ToString(), bigTable2.ToString());
3636
}
3737

38+
/// <summary>
39+
/// LUA table key being truncated by reader buffer boundary.
40+
/// </summary>
41+
[Theory]
42+
[InlineData("0123456789ABCDEF", 3)]
43+
[InlineData("0123456789ABCDEF", 10)]
44+
[InlineData("0123456789ABCDEF", 64)]
45+
[InlineData("0123456789ABCDEF", 100)]
46+
public void Issue3(string seed, int repeat)
47+
{
48+
var bigTable = new LTable
49+
{
50+
["Field1"] = 12345,
51+
["Field2"] = "Test",
52+
};
53+
for (var i = 0; i < repeat; i++)
54+
bigTable["TestField" + i] = seed + i;
55+
var serialized = bigTable.ToString(Formatting.Prettified);
56+
Assert.Contains("12345", serialized);
57+
Assert.Contains("Test", serialized);
58+
var bigTable2 = LToken.Parse(serialized);
59+
Assert.Equal(bigTable.ToString(), bigTable2.ToString());
60+
}
61+
3862
}
3963
}

0 commit comments

Comments
 (0)