diff --git a/src/lua/bsdsocket.cc b/src/lua/bsdsocket.cc
index a3c08b5f931e6b77fdeb8ae1656b2e274e089fd8..189719254e2df1f5efae2e526edd3a7a51d1abf9 100644
--- a/src/lua/bsdsocket.cc
+++ b/src/lua/bsdsocket.cc
@@ -507,6 +507,11 @@ lbox_bsdsocket_push_family(struct lua_State *L, int family)
 static int
 lbox_bsdsocket_push_protocol(struct lua_State *L, int protonumber)
 {
+	if (protonumber == 0) {
+		lua_pushinteger(L, 0);
+		return 1;
+	}
+
 	struct protoent *p = getprotobynumber(protonumber);
 	if (p) {
 		lua_pushstring(L, p->p_name);
diff --git a/test/box/bsdsocket.result b/test/box/bsdsocket.result
index 7437f619021e3cd8402dbe5192130b69649d620b..4e0e3fa6e54888169147b56e2f7a3d5b072e06d2 100644
--- a/test/box/bsdsocket.result
+++ b/test/box/bsdsocket.result
@@ -1452,7 +1452,7 @@ server:close()
 - true
 ...
 -- Test that socket is closed on GC
-s = socket('AF_UNIX', 'SOCK_STREAM', 'ip')
+s = socket('AF_UNIX', 'SOCK_STREAM', 0)
 ---
 ...
 s:bind('unix/', path)
@@ -1484,7 +1484,7 @@ os.remove(path)
 - true
 ...
 -- Test serializers with sockets
-s = socket('AF_UNIX', 'SOCK_STREAM', 'ip')
+s = socket('AF_UNIX', 'SOCK_STREAM', 0)
 ---
 ...
 x = s:wait()
diff --git a/test/box/bsdsocket.test.lua b/test/box/bsdsocket.test.lua
index 83ad91056fe56b9f0c70dd2da1732d3f7213f8a9..e35748f619ff8034822e8f53a3990f5b4dcf4759 100644
--- a/test/box/bsdsocket.test.lua
+++ b/test/box/bsdsocket.test.lua
@@ -493,7 +493,7 @@ client:close()
 server:close()
 
 -- Test that socket is closed on GC
-s = socket('AF_UNIX', 'SOCK_STREAM', 'ip')
+s = socket('AF_UNIX', 'SOCK_STREAM', 0)
 s:bind('unix/', path)
 s:listen()
 s = nil
@@ -503,7 +503,7 @@ socket.tcp_connect('unix/', path), errno() == errno.ECONNREFUSED
 os.remove(path)
 
 -- Test serializers with sockets
-s = socket('AF_UNIX', 'SOCK_STREAM', 'ip')
+s = socket('AF_UNIX', 'SOCK_STREAM', 0)
 x = s:wait()
 -- waiters is map
 s.waiters