server: Make sure to release the fd we grabbed in all cases.
diff --git a/server/fd.c b/server/fd.c
index 90fb7af..37e0ef2 100644
--- a/server/fd.c
+++ b/server/fd.c
@@ -1505,16 +1505,23 @@
     int events, ret;
     struct fd *fd = get_obj_fd( obj );
 
-    if (fd->inode) return 1;  /* regular files are always signaled */
+    if (fd->inode) ret = 1; /* regular files are always signaled */
+    else
+    {
+        events = fd->fd_ops->get_poll_events( fd );
+        ret = check_fd_events( fd, events ) != 0;
 
-    events = fd->fd_ops->get_poll_events( fd );
-    ret = check_fd_events( fd, events ) != 0;
-
-    if (ret)
-        set_fd_events( fd, 0 ); /* stop waiting on select() if we are signaled */
-    else if (!list_empty( &obj->wait_queue ))
-        set_fd_events( fd, events ); /* restart waiting on poll() if we are no longer signaled */
-
+        if (ret)
+        {
+            /* stop waiting on select() if we are signaled */
+            set_fd_events( fd, 0 );
+        }
+        else if (!list_empty( &obj->wait_queue ))
+        {
+            /* restart waiting on poll() if we are no longer signaled */
+            set_fd_events( fd, events );
+        }
+    }
     release_object( fd );
     return ret;
 }