diff --git a/src/lua/bsdsocket.cc b/src/lua/bsdsocket.cc
index f506998b9cb67ac38c12d308f6a43d5aa034601d..570faca546a4ef036afc00a238777adbfd2f1afc 100644
--- a/src/lua/bsdsocket.cc
+++ b/src/lua/bsdsocket.cc
@@ -427,7 +427,9 @@ lbox_bsdsocket_iowait(struct lua_State *L)
 	ev_set_priority(&io, EV_MAXPRI);
 	ev_io_start(&io);
 
+	fiber_setcancellable(true);
 	fiber_yield_timeout(timeout);
+	fiber_setcancellable(false);
 	ev_io_stop(&io);
 
 	int ret = 0;
diff --git a/src/lua/bsdsocket.lua b/src/lua/bsdsocket.lua
index 9a9ac7ef3333b1c9d38067d1f86a678877108a12..628705ca51ec9e99f16628b93489cc9e86e235ca 100644
--- a/src/lua/bsdsocket.lua
+++ b/src/lua/bsdsocket.lua
@@ -180,6 +180,7 @@ local function wait_safely(self, what, timeout)
     self.waiters[fid] = f
     local res = box.socket.internal.iowait(self.fh, what, timeout)
     self.waiters[fid] = nil
+    box.fiber.testcancel()
     return res
 end
 
diff --git a/test/box/bsdsocket.result b/test/box/bsdsocket.result
index ad78ab5db49a8516defc4938f68475bf47ef49a0..aff05e6d658b3b98293ea2597cfe4e37b4d216ad 100644
--- a/test/box/bsdsocket.result
+++ b/test/box/bsdsocket.result
@@ -219,7 +219,7 @@ lua s:getsockopt('SOL_SOCKET', 'SO_DEBUG')
 ...
 lua s:setsockopt('SOL_SOCKET', 'SO_ACCEPTCONN', 1)
 ---
-error: '[string "-- bsdsocket.lua (internal file)..."]:321: Socket option SO_ACCEPTCONN is read only'
+error: '[string "-- bsdsocket.lua (internal file)..."]:322: Socket option SO_ACCEPTCONN is read only'
 ...
 lua s:getsockopt('SOL_SOCKET', 'SO_RCVBUF') > 32
 ---