summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/gsp_sema_service.c23
1 files changed, 11 insertions, 12 deletions
diff --git a/kernel/gsp_sema_service.c b/kernel/gsp_sema_service.c
index a789796..fd70869 100644
--- a/kernel/gsp_sema_service.c
+++ b/kernel/gsp_sema_service.c
@@ -7697,19 +7697,18 @@ static int svc_read_va_push_ex(struct nv_vgpu_device *vgpu,
!svc_push_prefix_ok(p, chunk))
continue; /* content says: wrong pin */
/*
- * ISSUE-0002 (r50): a window guess is a linear
- * extrapolation from the paired base page; the push
- * buffer is not guaranteed physically contiguous (r49:
- * the second session's CE push pages read all-zero
- * through the window while the per-page sources were
- * never tried because the window read "succeeded").
- * Never let an implausible window read shadow the
- * learned/discovered resolvers: fall through to src=3.
- * A valid push's first chunk always parses, so this
- * cannot reject a correct window read.
+ * ISSUE-0002 (r51): a window guess that reads ALL
+ * ZEROS cannot be right - the paired base page is
+ * real, so a zero first chunk means the linear window
+ * does not describe this page (r49: the second
+ * session's CE push pages read zeros and, because the
+ * read "succeeded", shadowed the per-page resolvers).
+ * Fall through to src=3 instead. Non-zero window
+ * content stays trusted exactly as before (r50:
+ * requiring method-stream plausibility rejected valid
+ * non-method push prefixes and corrupted c1).
*/
- if (src == 2 && first &&
- !svc_method_stream_plausible(p, chunk))
+ if (src == 2 && first && !memchr_inv(p, 0, chunk))
continue;
done = true;
}