diff --git a/ada_url/ada_adapter.py b/ada_url/ada_adapter.py index 0d62059..6fd544d 100644 --- a/ada_url/ada_adapter.py +++ b/ada_url/ada_adapter.py @@ -116,8 +116,7 @@ def _get_obj(constructor, destructor, *args): def _get_str(x): - ret = ffi.string(x.data, x.length).decode() if x.length else '' - return ret + return bytes(ffi.buffer(x.data, x.length)).decode() if x.length else '' class URL: @@ -217,7 +216,7 @@ def __deepcopy__(self, memo): cls = self.__class__ ret = cls.__new__(cls) super(URL, ret).__init__() - ret.urlobj = lib.ada_copy(self.urlobj) + ret.urlobj = _get_obj(lib.ada_copy, lib.ada_free, self.urlobj) return ret @@ -396,14 +395,16 @@ def get(self, key: str) -> str: return _get_str(item) def get_all(self, key: str) -> List[str]: + ret = [] key_bytes = key.encode() items = lib.ada_search_params_get_all(self.paramsobj, key_bytes, len(key_bytes)) - count = lib.ada_strings_size(items) - - ret = [] - for i in range(count): - value = _get_str(lib.ada_strings_get(items, i)) - ret.append(value) + try: + count = lib.ada_strings_size(items) + for i in range(count): + value = _get_str(lib.ada_strings_get(items, i)) + ret.append(value) + finally: + lib.ada_free_strings(items) return ret diff --git a/pyproject.toml b/pyproject.toml index 02d9b0f..8c55a31 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "ada-url" -version = "1.31.0" +version = "1.32.0" authors = [ {name = "Bo Bayles", email = "bo@bbayles.com"}, ] diff --git a/tests/test_ada_url.py b/tests/test_ada_url.py index ce82a97..081c7a9 100644 --- a/tests/test_ada_url.py +++ b/tests/test_ada_url.py @@ -531,6 +531,13 @@ def test_replace_search_params(self): expected = 'key2=value3&key1=value4&key1=value5' self.assertEqual(actual, expected) + def test_null_handling(self): + evil_input = 'admin\x00hidden=true&safe=value' + params = SearchParams(evil_input) + actual = list(params.keys()) + expected = ['admin\x00hidden', 'safe'] + self.assertEqual(actual, expected) + class ParseTests(TestCase): def test_url_suite(self):