[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 19/21] xenvif: Assert non-NULL pointers that code analysis cannot prove


  • To: win-pv-devel@xxxxxxxxxxxxxxxxxxxx
  • From: Césaire Mounah <cesaire.mounah@xxxxxxxxxx>
  • Date: Mon, 12 Oct 2026 12:23:31 +0200
  • Authentication-results: eu.smtp.expurgate.cloud; dkim=pass header.s=selector1 header.d=vates.tech header.i="@vates.tech" header.h="From:Subject:Date:Message-ID:To:Cc:MIME-Version:Content-Type:In-Reply-To:References:Feedback-ID"
  • Cc: Césaire Mounah <cesaire.mounah@xxxxxxxxxx>
  • Delivery-date: Mon, 12 Oct 2026 10:23:58 +0000
  • Feedback-id: default:8631fc262581453bbf619ec5b2062170:Sweego
  • List-id: Developer list for the Windows PV Drivers subproject <win-pv-devel.lists.xenproject.org>

Code analysis reports that some pointers could be NULL when passed to
functions that require a valid pointer: the grant entry and the MDL of a
pending receiver fragment, and the rings released in ReceiverTeardown and
TransmitterTeardown. They cannot be NULL here, because xenvif sets them
itself during setup. Assert this before each use.

Signed-off-by: Césaire Mounah <cesaire.mounah@xxxxxxxxxx>
---
 src/xenvif/receiver.c    |  6 ++++++
 src/xenvif/transmitter.c |  2 ++
 src/xenvif/vif.c         | 26 ++++++++++++++++++++------
 3 files changed, 28 insertions(+), 6 deletions(-)

diff --git a/src/xenvif/receiver.c b/src/xenvif/receiver.c
index 68c2288..3249d91 100644
--- a/src/xenvif/receiver.c
+++ b/src/xenvif/receiver.c
@@ -1929,6 +1929,8 @@ __ReceiverRingEmpty(
         Mdl = Fragment->Context;
         Fragment->Context = NULL;
 
+        ASSERT3P(Fragment->Entry, !=, NULL);
+
         (VOID) XENBUS_GNTTAB(RevokeForeignAccess,
                              &Receiver->GnttabInterface,
                              Ring->GnttabCache,
@@ -3668,6 +3670,10 @@ ReceiverTeardown(
     while (--Index >= 0) {
         PXENVIF_RECEIVER_RING   Ring = Receiver->Ring[Index];
 
+        // As Ring is expected to be a valid pointer, 
+        // we assert it is not NULL before proceeding.
+        ASSERT3P(Ring, !=, NULL);
+
         Receiver->Ring[Index] = NULL;
         __ReceiverRingTeardown(Ring);
     }
diff --git a/src/xenvif/transmitter.c b/src/xenvif/transmitter.c
index 3263089..d3d77bd 100644
--- a/src/xenvif/transmitter.c
+++ b/src/xenvif/transmitter.c
@@ -5022,6 +5022,8 @@ TransmitterTeardown(
     while (--Index >= 0) {
         PXENVIF_TRANSMITTER_RING    Ring = Transmitter->Ring[Index];
 
+        ASSERT3P(Ring, !=, NULL);
+
         Transmitter->Ring[Index] = NULL;
         __TransmitterRingTeardown(Ring);
     }
diff --git a/src/xenvif/vif.c b/src/xenvif/vif.c
index c8dc446..69ec6b1 100644
--- a/src/xenvif/vif.c
+++ b/src/xenvif/vif.c
@@ -249,9 +249,17 @@ VifCallbackVersion8(
     _In_ union _XENVIF_VIF_CALLBACK_PARAMETERS_V9   *Parameters
     )
 {
-    PXENVIF_VIF_CONTEXT                             Context = _Argument;
-    XENVIF_VIF_CALLBACK_V8                          Callback = 
Context->CallbackVersion8;
-    PVOID                                           Argument = 
Context->ArgumentVersion8;
+    PXENVIF_VIF_CONTEXT                             Context;
+    XENVIF_VIF_CALLBACK_V8                          Callback;
+    PVOID                                           Argument;
+
+    // As _Argument is expected to be a valid context pointer, 
+    // we assert it is not NULL before proceeding.
+    ASSERT3P(_Argument, !=, NULL);
+    Context = _Argument;
+    Callback = Context->CallbackVersion8;
+    Argument = Context->ArgumentVersion8;
+
 
     switch (Type) {
     case XENVIF_TRANSMITTER_RETURN_PACKET: {
@@ -311,11 +319,17 @@ VifCallbackVersion9(
 {
 #define XENVIF_RECEIVER_QUEUE_MAX 1024 // Chosen to match IN_NDIS_MAX in XENNET
 
-    PXENVIF_VIF_CONTEXT                             Context = _Argument;
-    XENVIF_VIF_CALLBACK_V9                          Callback = 
Context->CallbackVersion9;
-    PVOID                                           Argument = 
Context->ArgumentVersion9;
+    PXENVIF_VIF_CONTEXT                             Context;
+    XENVIF_VIF_CALLBACK_V9                          Callback;
+    PVOID                                           Argument;
     union _XENVIF_VIF_CALLBACK_PARAMETERS_V9        ParametersVersion9;
 
+    ASSERT3P(_Argument, !=, NULL);
+    
+    Context = _Argument;
+    Callback = Context->CallbackVersion9;
+    Argument = Context->ArgumentVersion9;
+
     switch (Type) {
     case XENVIF_TRANSMITTER_RETURN_PACKET:
         ParametersVersion9.TransmitterReturnPacket.Cookie = 
Parameters->TransmitterReturnPacket.Cookie;
-- 
2.55.0.windows.5



--
Césaire Mounah | Vates Windows Guest Tools Engineer

XCP-ng & Xen Orchestra - Vates solutions

web: https://vates.tech

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.