Check the retrieved grant reference first; there's no point trying to
have xennet_move_rx_slot() move invalid data (and further defer
recognition of the issue, likely making diagnosis yet more difficult).

Signed-off-by: Jan Beulich <jbeul...@suse.com>
---
I question the log message claiming a bad ID (which is how I read its
wording): rx->id isn't involved in determining ref. I don't see what
else to usefully log, though, yet making the message just "Bad rx
response" also doesn't look very useful.

--- a/drivers/net/xen-netfront.c
+++ b/drivers/net/xen-netfront.c
@@ -1043,16 +1043,6 @@ static int xennet_get_responses(struct n
        }
 
        for (;;) {
-               if (unlikely(rx->status < 0 ||
-                            rx->offset + rx->status > XEN_PAGE_SIZE)) {
-                       if (net_ratelimit())
-                               dev_warn(dev, "rx->offset: %u, size: %d\n",
-                                        rx->offset, rx->status);
-                       xennet_move_rx_slot(queue, skb, ref);
-                       err = -EINVAL;
-                       goto next;
-               }
-
                /*
                 * This definitely indicates a bug, either in this driver or in
                 * the backend driver. In future this should flag the bad
@@ -1065,6 +1055,16 @@ static int xennet_get_responses(struct n
                        err = -EINVAL;
                        goto next;
                }
+
+               if (unlikely(rx->status < 0 ||
+                            rx->offset + rx->status > XEN_PAGE_SIZE)) {
+                       if (net_ratelimit())
+                               dev_warn(dev, "rx->offset: %u, size: %d\n",
+                                        rx->offset, rx->status);
+                       xennet_move_rx_slot(queue, skb, ref);
+                       err = -EINVAL;
+                       goto next;
+               }
 
                if (!gnttab_end_foreign_access_ref(ref)) {
                        dev_alert(dev,


Reply via email to