summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy McCurdy <andy@andymccurdy.com>2019-01-02 13:22:29 -0800
committerAndy McCurdy <andy@andymccurdy.com>2019-01-02 13:22:29 -0800
commit6a6548ea99c2c4667ae0ab82fde056b2acde777b (patch)
tree5443a5c0078d09c865fecbecece3251f38363cc0
parent15853dc45bf796d003b7b313d1d4821ae2c8218c (diff)
downloadredis-py-lock-owned.tar.gz
ensure token comparison is always comparing bytes objectslock-owned
-rw-r--r--redis/lock.py11
-rw-r--r--tests/test_lock.py2
2 files changed, 11 insertions, 2 deletions
diff --git a/redis/lock.py b/redis/lock.py
index edf97d2..8d481d7 100644
--- a/redis/lock.py
+++ b/redis/lock.py
@@ -168,6 +168,9 @@ class Lock(object):
sleep = self.sleep
if token is None:
token = uuid.uuid1().hex.encode()
+ else:
+ encoder = self.redis.connection_pool.get_encoder()
+ token = encoder.encode(token)
if blocking is None:
blocking = self.blocking
if blocking_timeout is None:
@@ -205,8 +208,14 @@ class Lock(object):
"""
Returns True if this key is locked by this lock, otherwise False.
"""
+ stored_token = self.redis.get(self.name)
+ # need to always compare bytes to bytes
+ # TODO: this can be simplified when the context manager is finished
+ if stored_token and not isinstance(stored_token, bytes):
+ encoder = self.redis.connection_pool.get_encoder()
+ stored_token = encoder.encode(stored_token)
return self.local.token is not None and \
- self.redis.get(self.name) == self.local.token
+ stored_token == self.local.token
def release(self):
"Releases the already acquired lock"
diff --git a/tests/test_lock.py b/tests/test_lock.py
index f8218f6..f92afec 100644
--- a/tests/test_lock.py
+++ b/tests/test_lock.py
@@ -28,7 +28,7 @@ class TestLock(object):
lock = self.get_lock(r, 'foo')
assert lock.acquire(blocking=False, token='test')
assert r.get('foo') == b'test'
- assert lock.local.token == 'test'
+ assert lock.local.token == b'test'
assert r.ttl('foo') == -1
lock.release()
assert r.get('foo') is None