/* peek cache of free slot */
        if (pool->left != FC_XID_UNKNOWN) {
-               index = pool->left;
-               pool->left = FC_XID_UNKNOWN;
-               goto hit;
+               if (!WARN_ON(fc_exch_ptr_get(pool, pool->left))) {
+                       index = pool->left;
+                       pool->left = FC_XID_UNKNOWN;
+                       goto hit;
+               }
        }
        if (pool->right != FC_XID_UNKNOWN) {
-               index = pool->right;
-               pool->right = FC_XID_UNKNOWN;
-               goto hit;
+               if (!WARN_ON(fc_exch_ptr_get(pool, pool->right))) {
+                       index = pool->right;
+                       pool->right = FC_XID_UNKNOWN;
+                       goto hit;
+               }
        }
 
        index = pool->next_index;
                                fc_frame_free(fp);
                        break;
                case FC_RCTL_BA_ABTS:
-                       fc_exch_recv_abts(ep, fp);
+                       if (ep)
+                               fc_exch_recv_abts(ep, fp);
+                       else
+                               fc_frame_free(fp);
                        break;
                default:                        /* ignore junk */
                        fc_frame_free(fp);