From 6a6548ea99c2c4667ae0ab82fde056b2acde777b Mon Sep 17 00:00:00 2001 From: Andy McCurdy Date: Wed, 2 Jan 2019 13:22:29 -0800 Subject: ensure token comparison is always comparing bytes objects --- redis/lock.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'redis/lock.py') 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" -- cgit v1.2.1