diff --git a/src/lua/lua_socket.cc b/src/lua/lua_socket.cc index 710642eb001e7793d3f8e7212053ae3043e74d06..5cb95033baf25201d8b211c1f80b4eddd350cb1a 100644 --- a/src/lua/lua_socket.cc +++ b/src/lua/lua_socket.cc @@ -271,7 +271,7 @@ lbox_socket_close(struct lua_State *L) static int lbox_socket_shutdown(struct lua_State *L) { - struct bio_socket *s = bio_checkactivesocket(L, -1); + struct bio_socket *s = bio_checkactivesocket(L, 1); int how = luaL_checkint(L, 2); bio_clearerr(s); if (shutdown(s->io_w.fd, how)) diff --git a/test/box/socket.result b/test/box/socket.result index ccf0233e5984c3664afd0386867ecebc5a36bb70..9fe4147b6e3556f95ee3f08b90006e5cb1078fb7 100644 --- a/test/box/socket.result +++ b/test/box/socket.result @@ -933,3 +933,9 @@ lua reps --- - 3 ... +lua function server() ms = box.socket.tcp() ms:bind('127.0.0.1', 8181) ms:listen() while true do local s = ms:accept( .5 ) if s ~= 'timeout' then print("accepted connection ", s) s:send('Hello world') s:shutdown(box.socket.SHUT_RDWR) end end end box.fiber.wrap(server) +--- +... +Hello world +Hello world +Hello world diff --git a/test/box/socket.test b/test/box/socket.test index beb7c2df679c751ad62de8acbd4c8094005aa788..d544fc117eb6a79bad163b1a7b5035be1a4e60d8 100644 --- a/test/box/socket.test +++ b/test/box/socket.test @@ -560,3 +560,45 @@ exec admin "lua iotest()" exec admin "lua iotest()" exec admin "lua iotest()" exec admin "lua reps" + +# Bug #43: incorrect box:shutdown() arg handling +# https://github.com/tarantool/tarantool/issues/43 +# +test=""" +function server() + ms = box.socket.tcp() + ms:bind('127.0.0.1', 8181) + ms:listen() + + while true do + local s = ms:accept( .5 ) + if s ~= 'timeout' then + print("accepted connection ", s) + s:send('Hello world') + s:shutdown(box.socket.SHUT_RDWR) + end + end +end + +box.fiber.wrap(server) +""" + +exec admin "lua " + test.replace('\n', ' ') + +s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +s.connect(('127.0.0.1', 8181)) +data = s.recv(1024) +s.close() +print data + +s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +s.connect(('127.0.0.1', 8181)) +data = s.recv(1024) +s.close() +print data + +s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +s.connect(('127.0.0.1', 8181)) +data = s.recv(1024) +s.close() +print data