mirror of
https://github.com/OpenVPN/openvpn.git
synced 2026-05-28 04:03:29 -04:00
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 <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>
This commit is contained in:
parent
4410daac5a
commit
64f8833e11
1 changed files with 15 additions and 13 deletions
|
|
@ -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();
|
||||
|
|
|
|||
Loading…
Reference in a new issue