From 79dc41ab058ff6497d7db0cc19951bade41c1bdd Mon Sep 17 00:00:00 2001
From: Dmitry Simonenko <pmwkaa@gmail.com>
Date: Fri, 11 Oct 2013 17:23:44 +0400
Subject: [PATCH] gh-43: incorrect socket:shutdown() arg handling. fixes #43

---
 src/lua/lua_socket.cc  |  2 +-
 test/box/socket.result |  6 ++++++
 test/box/socket.test   | 42 ++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 49 insertions(+), 1 deletion(-)

diff --git a/src/lua/lua_socket.cc b/src/lua/lua_socket.cc
index 710642eb00..5cb95033ba 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 ccf0233e59..9fe4147b6e 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 beb7c2df67..d544fc117e 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
-- 
GitLab