From b224a1634ac60ebbfcfa39dcf3f5d99930cf592b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arth=C3=B4?= <22568556+ArthoPacini@users.noreply.github.com> Date: Fri, 8 Nov 2024 10:08:58 -0300 Subject: [PATCH] Fix SegFault in req.get_query() call This would segfault if called after an middleware that called an asynchronous function --- src/socketify/socketify.py | 31 ++++++++++++------------------- 1 file changed, 12 insertions(+), 19 deletions(-) diff --git a/src/socketify/socketify.py b/src/socketify/socketify.py index b651960..e9a3bf3 100644 --- a/src/socketify/socketify.py +++ b/src/socketify/socketify.py @@ -2489,25 +2489,18 @@ class AppRequest: return None def get_query(self, key): - if self._query: - return self._query.get(key, None) - buffer = ffi.new("char**") - - if isinstance(key, str): - key_data = key.encode("utf-8") - elif isinstance(key, bytes): - key_data = key - else: - key_data = self.app._json_serializer.dumps(key).encode("utf-8") - - length = lib.uws_req_get_query(self.req, key_data, len(key_data), buffer) - buffer_address = ffi.addressof(buffer, 0)[0] - if buffer_address == ffi.NULL: - return None - try: - return ffi.unpack(buffer_address, length).decode("utf-8") - except Exception: # invalid utf-8 - return None + if self._query is None: + # Cache the query parameters + buffer = ffi.new("char**") + query_string_length = lib.uws_req_get_query_string(self.req, buffer) + if query_string_length > 0: + buffer_address = ffi.addressof(buffer, 0)[0] + query_string = ffi.unpack(buffer_address, query_string_length).decode("utf-8") + from urllib.parse import parse_qs + self._query = parse_qs(query_string) + else: + self._query = {} + return self._query.get(key, None) def get_parameters(self): if self._params: