changeset 2262:f92d4f056587

The return value of dmResourceRef() and dmResourceUnref() had a possibility of being off by one due to a potential race condition. Fixed.
author Matti Hamalainen <ccr@tnsp.org>
date Mon, 17 Jun 2019 00:57:02 +0300
parents e286454d305f
children 891acec47aa0
files src/dmres.c
diffstat 1 files changed, 8 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/dmres.c	Mon Jun 17 00:55:07 2019 +0300
+++ b/src/dmres.c	Mon Jun 17 00:57:02 2019 +0300
@@ -1014,22 +1014,26 @@
 
 int dmResourceRef(DMResource *node)
 {
+    int res;
+
     dmLockLibMutex(node->lib);
     node->atime = time(NULL);
-    node->refcount++;
+    res = ++node->refcount;
     dmUnlockLibMutex(node->lib);
 
-    return node->refcount;
+    return res;
 }
 
 
 int dmResourceUnref(DMResource *node)
 {
+    int res;
+
     dmLockLibMutex(node->lib);
-    node->refcount--;
+    res = --node->refcount;
     dmUnlockLibMutex(node->lib);
 
-    return node->refcount;
+    return res;
 }