summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwil paredes <code@dystedium.com>2014-06-05 15:47:11 -0700
committerwil paredes <code@dystedium.com>2014-06-05 15:47:11 -0700
commit643d76d9af708f3dc5718be16b72f8a911e26d4f (patch)
treed83325f032431b04392252cc932923b94e143418
parente7589d76a20b577bbc65fbfcdb270435b24af444 (diff)
downloadredis-py-643d76d9af708f3dc5718be16b72f8a911e26d4f.tar.gz
Lock.release(): reorder code to avoid token overwrite
* assignment to self.token was not protected by the lock, so the value could get overwritten * do_release() now has an expected_token parameter that receives the old token value * NOTE: this only fixes the issue for locks that do not have timeouts
-rw-r--r--redis/lock.py16
1 files changed, 7 insertions, 9 deletions
diff --git a/redis/lock.py b/redis/lock.py
index 8008d22..e6070c4 100644
--- a/redis/lock.py
+++ b/redis/lock.py
@@ -100,18 +100,16 @@ class Lock(object):
"Releases the already acquired lock"
if self.token is None:
raise LockError("Cannot release an unlocked lock")
- try:
- self.do_release()
- finally:
- self.token = None
+ expected_token = self.token
+ self.token = None
+ self.do_release(expected_token)
- def do_release(self):
+ def do_release(self, expected_token):
name = self.name
- token = self.token
def execute_release(pipe):
lock_value = pipe.get(name)
- if lock_value != token:
+ if lock_value != expected_token:
raise LockError("Cannot release a lock that's no longer owned")
pipe.delete(name)
@@ -229,9 +227,9 @@ class LuaLock(Lock):
args=[token, timeout],
client=self.redis))
- def do_release(self):
+ def do_release(self, expected_token):
if not bool(self.lua_release(keys=[self.name],
- args=[self.token],
+ args=[expected_token],
client=self.redis)):
raise LockError("Cannot release a lock that's no longer owned")