A static global is incorrectly used as the tap state for all win32 taps created. Instead, we now allocate per win32 tap.
Signed-off-by: Gal Horowitz <[email protected]> --- net/tap-win32.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/net/tap-win32.c b/net/tap-win32.c index ae25e5a883343bf9f570d0f382b8c64712d95242..3d7227fcf47ff45bbdbf60cd5b86ab8f8913b941 100644 --- a/net/tap-win32.c +++ b/net/tap-win32.c @@ -115,8 +115,6 @@ typedef struct tap_win32_overlapped { tun_buffer_t* output_queue_back; } tap_win32_overlapped_t; -static tap_win32_overlapped_t tap_overlapped; - static tun_buffer_t* get_buffer_from_free_list(tap_win32_overlapped_t* const overlapped) { tun_buffer_t* buffer = NULL; @@ -403,8 +401,10 @@ static int tap_win32_set_status(HANDLE handle, int status) &status, sizeof (status), &len, NULL); } -static void tap_win32_overlapped_init(tap_win32_overlapped_t* const overlapped, const HANDLE handle) +static tap_win32_overlapped_t *tap_win32_overlapped_new(const HANDLE handle) { + tap_win32_overlapped_t *overlapped = g_new0(tap_win32_overlapped_t, 1); + overlapped->handle = handle; overlapped->read_event = CreateEvent(NULL, FALSE, FALSE, NULL); @@ -455,6 +455,8 @@ static void tap_win32_overlapped_init(tap_win32_overlapped_t* const overlapped, overlapped->tap_semaphore = CreateSemaphore(NULL, 0, TUN_MAX_BUFFER_COUNT, NULL); if(!overlapped->tap_semaphore) fprintf(stderr, "error creating tap_semaphore.\n"); + + return overlapped; } static int tap_win32_write(tap_win32_overlapped_t *overlapped, @@ -625,6 +627,7 @@ static int tap_win32_open(tap_win32_overlapped_t **phandle, unsigned long debug; } version; DWORD version_len; + tap_win32_overlapped_t *tap_overlapped = NULL; if (preferred_name != NULL) { snprintf(name_buffer, sizeof(name_buffer), "%s", preferred_name); @@ -666,10 +669,10 @@ static int tap_win32_open(tap_win32_overlapped_t **phandle, return -1; } - tap_win32_overlapped_init(&tap_overlapped, handle); + tap_overlapped = tap_win32_overlapped_new(handle); - tap_overlapped.thread_handle = CreateThread(NULL, 0, - tap_win32_thread_entry, (LPVOID)&tap_overlapped, 0, NULL); + tap_overlapped->thread_handle = CreateThread(NULL, 0, + tap_win32_thread_entry, (LPVOID)tap_overlapped, 0, NULL); if (tap_overlapped->thread_handle == NULL) { tap_win32_close(tap_overlapped); -- 2.34.1
