From 1a5e3e748a5ea4f48e3e88fa3859db4c186d6ba5 Mon Sep 17 00:00:00 2001 From: Richard Maw Date: Fri, 11 Jul 2014 15:09:14 +0000 Subject: Make our use of json binary path safe json only accepts unicode. Various APIs such as file paths and environment variables allow binary data, so we need to support this properly. This patch changes every[1] use of json.load or json.dump to escape non-unicode data strings. This appears exactly as it used to if the input was valid unicode, if it isn't it will insert \xabcd escapes in the place of non-unicode data. When loading back in, if json.load is told to unescape it with `encoding='unicode-escape'` then it will convert it back correctly. This change was primarily to support file paths that weren't valid unicode, where this would choke and die. Now it works, but any tools that parsed the metadata need to unescape the paths. [1]: The interface to the remote repo cache uses json data, but I haven't changes its json.load calls to unescape the data, since the repo caches haven't been made to escape the data. --- morphlib/systemmetadatadir.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'morphlib/systemmetadatadir.py') diff --git a/morphlib/systemmetadatadir.py b/morphlib/systemmetadatadir.py index eac5b446..7e89142c 100644 --- a/morphlib/systemmetadatadir.py +++ b/morphlib/systemmetadatadir.py @@ -1,4 +1,4 @@ -# Copyright (C) 2013 Codethink Limited +# Copyright (C) 2013-2014 Codethink Limited # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -66,14 +66,15 @@ class SystemMetadataDir(collections.MutableMapping): self._check_key(key) try: with open(self._join_path('%s.meta' % key), 'r') as f: - return json.load(f) + return json.load(f, encoding='unicode-escape') except IOError: raise KeyError(key) def __setitem__(self, key, value): self._check_key(key) with open(self._join_path('%s.meta' % key), 'w') as f: - json.dump(value, f, indent=4, sort_keys=True) + json.dump(value, f, indent=4, sort_keys=True, + encoding='unicode-escape') def __delitem__(self, key): self._check_key(key) -- cgit v1.2.1