]> Chaos Git - corbenik/ctrulib.git/commitdiff
Fix potential race condition in LightLock_Unlock() (spotted by mtheall)
authorfincs <fincs.alt1@gmail.com>
Wed, 7 Oct 2015 19:48:26 +0000 (21:48 +0200)
committerfincs <fincs.alt1@gmail.com>
Wed, 7 Oct 2015 19:48:26 +0000 (21:48 +0200)
libctru/source/synchronization.c

index 146a539d495ca57854b9f9a999ae0aaa83aea444..9bc293fec6d790f2deb849da2a730ee3c75f2eb3 100644 (file)
@@ -50,7 +50,7 @@ void LightLock_Unlock(LightLock* lock)
                // Wake up exactly one thread
                do
                        val = __ldrex(lock);
-               while (__strex(lock, val-1));
+               while (__strex(lock, val >= 0 ? (val-1) : (val+1)));
                svcArbitrateAddress(arbiter, (u32)lock, ARBITRATION_SIGNAL, 1, 0);
        }
 }