14 сент. 2018 г., в 18:17, Vladimir Davydov <vdavydov.dev@gmail.com> написал(а):

On Mon, Sep 10, 2018 at 04:36:43PM +0300, Serge Petrenko wrote:
Calling box.schema.user:passwd() instead of box.schema.user.passwd()


This isn't a proper fix, because the following command still crashes:

 box.schema.user.passwd(123)

And this one crashes too:

 box.session.su('admin', function(x) return #x end, 123)

Making error messages user-friendly is good, but I think that #3659 is
about invalid usage of luaT_error in lbox_session_su...

Hi! I found the cause of this and fixed the issue. I also removed the type check since it
seems to be outside of the patch scope now. New diff is below.

---
 src/box/lua/session.c  | 5 ++++-
 test/box/misc.result   | 9 +++++++++
 test/box/misc.test.lua | 6 ++++++
 3 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/src/box/lua/session.c b/src/box/lua/session.c
index b2e1400b6..7541da0a7 100644
--- a/src/box/lua/session.c
+++ b/src/box/lua/session.c
@@ -201,8 +201,11 @@ lbox_session_su(struct lua_State *L)
  /* Restore the original credentials. */
  fiber_set_user(fiber(), old_credentials);
 
- if (error)
+ if (error) {
+ luaT_toerror(L);
  luaT_error(L);
+ }
+
  return lua_gettop(L) - 1;
 }
 
diff --git a/test/box/misc.result b/test/box/misc.result
index 62376754e..4ee4797d0 100644
--- a/test/box/misc.result
+++ b/test/box/misc.result
@@ -1148,6 +1148,15 @@ s = box.schema.space.create('test', {user="no_such_user"})
 ---
 - error: User 'no_such_user' is not found
 ...
+--
+-- gh-3659 assertion failure after an error in code called from
+-- box.session.su()
+--
+box.session.su("admin", function(x) return #x end, 3)
+---
+- error: '[string "return box.session.su("admin", function(x) re..."]:1: attempt to
+    get length of local ''x'' (a number value)'
+...
 -- Too long WAL write warning (gh-2743).
 s = box.schema.space.create('test')
 ---
diff --git a/test/box/misc.test.lua b/test/box/misc.test.lua
index d6815645e..ee81c7be1 100644
--- a/test/box/misc.test.lua
+++ b/test/box/misc.test.lua
@@ -320,6 +320,12 @@ s:drop()
 --
 s = box.schema.space.create('test', {user="no_such_user"})
 
+--
+-- gh-3659 assertion failure after an error in code called from
+-- box.session.su()
+--
+box.session.su("admin", function(x) return #x end, 3)
+
 -- Too long WAL write warning (gh-2743).
 s = box.schema.space.create('test')
 _ = s:create_index('pk')
-- 
2.15.2 (Apple Git-101.1)