From: Selva Nair Date: Thu, 29 Dec 2022 13:47:29 +0000 (-0500) Subject: Properly unmap ring buffer file-map in interactive service X-Git-Tag: v2.7_alpha1~610 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=64f8833e119e31cf01dfe198538fbb5566fabf8f;p=thirdparty%2Fopenvpn.git Properly unmap ring buffer file-map in interactive service 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 Acked-by: Lev Stipakov 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 --- diff --git a/src/openvpnserv/interactive.c b/src/openvpnserv/interactive.c index 5b396e011..47bcd72ac 100644 --- a/src/openvpnserv/interactive.c +++ b/src/openvpnserv/interactive.c @@ -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();