diff options
author | wil paredes <code@dystedium.com> | 2014-06-05 15:47:11 -0700 |
---|---|---|
committer | wil paredes <code@dystedium.com> | 2014-06-05 15:47:11 -0700 |
commit | 643d76d9af708f3dc5718be16b72f8a911e26d4f (patch) | |
tree | d83325f032431b04392252cc932923b94e143418 | |
parent | e7589d76a20b577bbc65fbfcdb270435b24af444 (diff) | |
download | redis-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.py | 16 |
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") |