]> git.ipfire.org Git - thirdparty/openvpn.git/commitdiff
Properly unmap ring buffer file-map in interactive service
authorSelva Nair <selva.nair@gmail.com>
Thu, 29 Dec 2022 13:47:29 +0000 (08:47 -0500)
committerGert Doering <gert@greenie.muc.de>
Thu, 29 Dec 2022 15:18:47 +0000 (16:18 +0100)
The return value of MapViewOfFile must be passed to UnmapViewofFile,
instead of the file handle.

Github: Fixes OpenVPN/openvpn#206

v2: move *ring = NULL inside if {}

Signed-off-by: Selva Nair <selva.nair@gmail.com>
Acked-by: Lev Stipakov <lstipakov@gmail.com>
Message-Id: <20221229134729.1474034-1-selva.nair@gmail.com>
URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg25859.html
Signed-off-by: Gert Doering <gert@greenie.muc.de>
(cherry picked from commit 64f8833e119e31cf01dfe198538fbb5566fabf8f)

src/openvpnserv/interactive.c

index 5b396e01154a3267d1d04c216d75ad5282a88582..47bcd72ac33febd0b0feb68de41eaa051e31016a 100644 (file)
@@ -109,6 +109,8 @@ typedef struct {
     HANDLE send_tail_moved;
     HANDLE receive_tail_moved;
     HANDLE device;
+    struct tun_ring *send_ring;
+    struct tun_ring *receive_ring;
 } ring_buffer_handles_t;
 
 
@@ -165,15 +167,14 @@ CloseHandleEx(LPHANDLE handle)
     return INVALID_HANDLE_VALUE;
 }
 
-static HANDLE
-OvpnUnmapViewOfFile(LPHANDLE handle)
+static void
+OvpnUnmapViewOfFile(struct tun_ring **ring)
 {
-    if (handle && *handle && *handle != INVALID_HANDLE_VALUE)
+    if (ring && *ring)
     {
-        UnmapViewOfFile(*handle);
-        *handle = INVALID_HANDLE_VALUE;
+        UnmapViewOfFile(*ring);
+        *ring = NULL;
     }
-    return INVALID_HANDLE_VALUE;
 }
 
 static void
@@ -182,8 +183,10 @@ CloseRingBufferHandles(ring_buffer_handles_t *ring_buffer_handles)
     CloseHandleEx(&ring_buffer_handles->device);
     CloseHandleEx(&ring_buffer_handles->receive_tail_moved);
     CloseHandleEx(&ring_buffer_handles->send_tail_moved);
-    OvpnUnmapViewOfFile(&ring_buffer_handles->send_ring_handle);
-    OvpnUnmapViewOfFile(&ring_buffer_handles->receive_ring_handle);
+    OvpnUnmapViewOfFile(&ring_buffer_handles->send_ring);
+    OvpnUnmapViewOfFile(&ring_buffer_handles->receive_ring);
+    CloseHandleEx(&ring_buffer_handles->receive_ring_handle);
+    CloseHandleEx(&ring_buffer_handles->send_ring_handle);
 }
 
 static HANDLE
@@ -1354,8 +1357,6 @@ HandleRegisterRingBuffers(const register_ring_buffers_message_t *rrb, HANDLE ovp
                           ring_buffer_handles_t *ring_buffer_handles)
 {
     DWORD err = 0;
-    struct tun_ring *send_ring;
-    struct tun_ring *receive_ring;
 
     CloseRingBufferHandles(ring_buffer_handles);
 
@@ -1365,13 +1366,13 @@ HandleRegisterRingBuffers(const register_ring_buffers_message_t *rrb, HANDLE ovp
         return err;
     }
 
-    err = DuplicateAndMapRing(ovpn_proc, rrb->send_ring_handle, &ring_buffer_handles->send_ring_handle, &send_ring);
+    err = DuplicateAndMapRing(ovpn_proc, rrb->send_ring_handle, &ring_buffer_handles->send_ring_handle, &ring_buffer_handles->send_ring);
     if (err != ERROR_SUCCESS)
     {
         return err;
     }
 
-    err = DuplicateAndMapRing(ovpn_proc, rrb->receive_ring_handle, &ring_buffer_handles->receive_ring_handle, &receive_ring);
+    err = DuplicateAndMapRing(ovpn_proc, rrb->receive_ring_handle, &ring_buffer_handles->receive_ring_handle, &ring_buffer_handles->receive_ring);
     if (err != ERROR_SUCCESS)
     {
         return err;
@@ -1389,7 +1390,8 @@ HandleRegisterRingBuffers(const register_ring_buffers_message_t *rrb, HANDLE ovp
         return err;
     }
 
-    if (!register_ring_buffers(ring_buffer_handles->device, send_ring, receive_ring,
+    if (!register_ring_buffers(ring_buffer_handles->device, ring_buffer_handles->send_ring,
+                               ring_buffer_handles->receive_ring,
                                ring_buffer_handles->send_tail_moved, ring_buffer_handles->receive_tail_moved))
     {
         err = GetLastError();