From a2ec81696de98151bfdf1913042a739ef6d8a36c Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Thu, 11 Jan 2018 14:38:06 +0100 Subject: contrib/npclient: fix DataID race There's a race with how the freetrack protocol operates. Reported-by: @Len62 cf. https://github.com/opentrack/opentrack/issues/688#issuecomment-356606126 --- bin/NPClient.dll | Bin 16384 -> 16384 bytes bin/NPClient64.dll | Bin 17408 -> 17408 bytes contrib/npclient/npclient.c | 6 +++--- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bin/NPClient.dll b/bin/NPClient.dll index ddfa667e..54a2d0f6 100644 Binary files a/bin/NPClient.dll and b/bin/NPClient.dll differ diff --git a/bin/NPClient64.dll b/bin/NPClient64.dll index eb56a256..f8315d50 100644 Binary files a/bin/NPClient64.dll and b/bin/NPClient64.dll differ diff --git a/contrib/npclient/npclient.c b/contrib/npclient/npclient.c index 6ffa7f34..71c5ec2a 100644 --- a/contrib/npclient/npclient.c +++ b/contrib/npclient/npclient.c @@ -332,19 +332,19 @@ NP_EXPORT(int) NP_GetData(tir_data_t * data) frameno++; data->frame = frameno; - int data_id = InterlockedDecrement((LONG volatile*) &pMemData->data.DataID); - + int data_id = InterlockedCompareExchange((LONG volatile*) &pMemData->data.DataID, -1, -1); bool running; if (data_id == 0) { running = true; y = 0, r = 0, p = 0, tx = 0, ty = 0, tz = 0; - InterlockedCompareExchange((LONG volatile*) &pMemData->data.DataID, -1, 0); + (void)InterlockedCompareExchange((LONG volatile*) &pMemData->data.DataID, -1, 0); } else if (data_id > 0) { running = true; + (void)InterlockedCompareExchange((LONG volatile*) &pMemData->data.DataID, data_id - 1, data_id); } else { -- cgit v1.2.3