commit 6955666290c7fd1e74126679441686223804ce06
parent 5298392c5ab452706b71a992b17e2a1bb2addde3
Author: Roberto Ierusalimschy <roberto@inf.puc-rio.br>
Date: Fri, 11 Jul 2008 14:27:18 -0300
'string.byte' gets confused with some out-of-range negative indices +
user-requested GC step may loop forever
Diffstat:
M | bugs | | | 61 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- |
1 file changed, 59 insertions(+), 2 deletions(-)
diff --git a/bugs b/bugs
@@ -1880,8 +1880,8 @@ patch = [[
+++ lundump.c 2008/04/04 19:51:41 2.7.1.4
@@ -1,5 +1,5 @@
/*
--** $Id: lundump.c,v 2.7.1.3 2008/04/04 16:00:45 roberto Exp $
-+** $Id: lundump.c,v 2.7.1.4 2008/04/04 19:51:41 roberto Exp $
+-** $Id: bugs,v 1.96 2008/05/08 16:55:08 roberto Exp roberto $
++** $Id: bugs,v 1.96 2008/05/08 16:55:08 roberto Exp roberto $
** load precompiled Lua chunks
** See Copyright Notice in lua.h
*/
@@ -1971,3 +1971,60 @@ patch = [[
]],
}
+
+Bug{
+what = [['string.byte' gets confused with some out-of-range negative indices]],
+report = [[Mike Pall, on 2008/06/03]],
+since = [[5.1]],
+example = [[
+print(string.byte("abc", -5)) --> 97 98 99 (should print nothing)
+]],
+patch = [[
+--- lstrlib.c 2007/12/28 15:32:23 1.132.1.3
++++ lstrlib.c 2008/07/05 11:53:42
+@@ -35,7 +35,8 @@
+
+ static ptrdiff_t posrelat (ptrdiff_t pos, size_t len) {
+ /* relative string position: negative means back from end */
+- return (pos>=0) ? pos : (ptrdiff_t)len+pos+1;
++ if (pos < 0) pos += (ptrdiff_t)len + 1;
++ return (pos >= 0) ? pos : 0;
+ }
+
+
+]],
+}
+
+
+Bug{
+what = [[user-requested GC step may loop forever]],
+report = [[Makoto Hamanaka, on 2008/07/01]],
+since = [[5.1]],
+example = [[
+collectgarbage("setpause", 100) -- small value
+collectgarbage("setstepmul", 2000) -- large value
+collectgarbage("step",0)
+]],
+patch = [[
+--- lapi.c 2008/02/14 16:46:39 2.55.1.4
++++ lapi.c 2008/07/04 18:34:48
+@@ -929,10 +929,13 @@
+ g->GCthreshold = g->totalbytes - a;
+ else
+ g->GCthreshold = 0;
+- while (g->GCthreshold <= g->totalbytes)
++ while (g->GCthreshold <= g->totalbytes) {
+ luaC_step(L);
+- if (g->gcstate == GCSpause) /* end of cycle? */
+- res = 1; /* signal it */
++ if (g->gcstate == GCSpause) { /* end of cycle? */
++ res = 1; /* signal it */
++ break;
++ }
++ }
+ break;
+ }
+ case LUA_GCSETPAUSE: {
+]],
+}
+