[tarantool-patches] [PATCH 1/1] luajit: fix string.find recording

Igor Munkin imun at tarantool.org
Thu Sep 5 20:57:28 MSK 2019


Fix provided within 587532e leads to invalid end index of the string
being matched while recording

Test related to this bug is also provided within this changeset

Relates to: LuaJIT gh-505
Fix: tarantool gh-4476
---
 src/lj_ffrecord.c                       |  4 +-
 test/fix_string_find_recording.test.lua | 79 +++++++++++++++++++++++++
 2 files changed, 81 insertions(+), 2 deletions(-)
 create mode 100755 test/fix_string_find_recording.test.lua

diff --git a/src/lj_ffrecord.c b/src/lj_ffrecord.c
index 632b8f2..8dfa80e 100644
--- a/src/lj_ffrecord.c
+++ b/src/lj_ffrecord.c
@@ -950,8 +950,8 @@ static void LJ_FASTCALL recff_string_find(jit_State *J, RecordFFData *rd)
       TRef pos;
       emitir(IRTG(IR_NE, IRT_PGC), tr, trp0);
       /* Caveat: can't use STRREF trstr 0 here because that might be pointing into a wrong string due to folding. */
-      pos = emitir(IRTI(IR_SUB), tr, trsptr);
-      J->base[0] = emitir(IRTI(IR_ADD), pos, emitir(IRTI(IR_ADD), trstart, lj_ir_kint(J, 1)));
+      pos = emitir(IRTI(IR_ADD), trstart, emitir(IRTI(IR_SUB), tr, trsptr));
+      J->base[0] = emitir(IRTI(IR_ADD), pos, lj_ir_kint(J, 1));
       J->base[1] = emitir(IRTI(IR_ADD), pos, trplen);
       rd->nres = 2;
     } else {
diff --git a/test/fix_string_find_recording.test.lua b/test/fix_string_find_recording.test.lua
new file mode 100755
index 0000000..d3fc9e1
--- /dev/null
+++ b/test/fix_string_find_recording.test.lua
@@ -0,0 +1,79 @@
+#!/usr/bin/env tarantool
+
+tap = require('tap')
+
+test = tap.test("fix-string-find-recording")
+test:plan(1)
+
+local err = [[module 'kit.1.10.3-136' not found:
+	no field package.preload['kit.1.10.3-136']
+	no file './kit/1/10/3-136.lua'
+	no file './kit/1/10/3-136/init.lua'
+	no file './kit/1/10/3-136.so'
+	no file '/bug/.rocks/share/tarantool/kit/1/10/3-136.lua'
+	no file '/bug/.rocks/share/tarantool/kit/1/10/3-136/init.lua'
+	no file '/.rocks/share/tarantool/kit/1/10/3-136.lua'
+	no file '/.rocks/share/tarantool/kit/1/10/3-136/init.lua'
+	no file '/bug/.rocks/lib/tarantool/kit/1/10/3-136.so'
+	no file '/.rocks/lib/tarantool/kit/1/10/3-136.so'
+	no file '/bug/app/kit/1/10/3-136.lua'
+	no file '/bug/app/kit/1/10/3-136/init.lua'
+	no file '/bug/libs/share/lua/5.1/kit/1/10/3-136.lua'
+	no file '/bug/libs/share/lua/5.1/kit/1/10/3-136/init.lua'
+	no file '/root/.luarocks/share/lua/5.1/kit/1/10/3-136.lua'
+	no file '/root/.luarocks/share/lua/5.1/kit/1/10/3-136/init.lua'
+	no file '/root/.luarocks/share/lua/kit/1/10/3-136.lua'
+	no file '/root/.luarocks/share/lua/kit/1/10/3-136/init.lua'
+	no file '/usr/local/share/tarantool/kit/1/10/3-136.lua'
+	no file '/usr/local/share/tarantool/kit/1/10/3-136/init.lua'
+	no file '/usr/share/tarantool/kit/1/10/3-136.lua'
+	no file '/usr/share/tarantool/kit/1/10/3-136/init.lua'
+	no file '/usr/local/share/lua/5.1/kit/1/10/3-136.lua'
+	no file '/usr/local/share/lua/5.1/kit/1/10/3-136/init.lua'
+	no file '/usr/share/lua/5.1/kit/1/10/3-136.lua'
+	no file '/usr/share/lua/5.1/kit/1/10/3-136/init.lua'
+	no file '/bug/libs/lib/lua/5.1/kit/1/10/3-136.so'
+	no file '/bug/libs/lib/lua/kit/1/10/3-136.so'
+	no file '/bug/libs/lib64/lua/5.1/kit/1/10/3-136.so'
+	no file '/root/.luarocks/lib/lua/5.1/kit/1/10/3-136.so'
+	no file '/root/.luarocks/lib/lua/kit/1/10/3-136.so'
+	no file '/usr/local/lib64/tarantool/kit/1/10/3-136.so'
+	no file '/usr/lib64/tarantool/kit/1/10/3-136.so'
+	no file '/usr/local/lib64/lua/5.1/kit/1/10/3-136.so'
+	no file '/usr/lib64/lua/5.1/kit/1/10/3-136.so'
+	no file '/bug/libs/lib/lua/5.1/kit.so'
+	no file '/bug/libs/lib/lua/kit.so'
+	no file '/bug/libs/lib64/lua/5.1/kit.so'
+	no file '/root/.luarocks/lib/lua/5.1/kit.so'
+	no file '/root/.luarocks/lib/lua/kit.so'
+	no file '/usr/local/lib64/tarantool/kit.so'
+	no file '/usr/lib64/tarantool/kit.so'
+	no file '/usr/local/lib64/lua/5.1/kit.so'
+	no file '/usr/lib64/lua/5.1/kit.so']]
+
+local at, s, e
+local count_vm = 0
+
+jit.off()
+
+repeat
+  s, e = err:find("\n\t", at, true)
+  at = e
+  count_vm = count_vm + 1
+until not e
+
+local count_jit = 0
+
+jit.on()
+jit.opt.start(0, 'hotloop=1')
+
+repeat
+  s, e = err:find("\n\t", at, true)
+  at = e
+  count_jit = count_jit + 1
+  assert(count_jit <= count_vm, "Trace goes in cycles")
+until not e
+
+test:is(count_vm, count_jit)
+
+test:check()
-- 
2.22.1





More information about the Tarantool-patches mailing list