# HG changeset patch # User Yuya Nishihara # Date 2018-07-15 09:32:17 # Node ID ff1182d166a24979d4e3b06985f095e2cb00a669 # Parent 6b5ca1d0aa1e6cc77f982146522924213d14bd92 obsolete: explode if metadata contains invalid UTF-8 sequence (API) The current metadata API can be a source of bugs since it forces callers to process encoding conversion by themselves. So let's make it reject bad data as a last ditch. I assume there's no metadata field which is supposed to store arbitrary BLOB like transplant_source. diff --git a/mercurial/obsolete.py b/mercurial/obsolete.py --- a/mercurial/obsolete.py +++ b/mercurial/obsolete.py @@ -80,6 +80,7 @@ from . import ( obsutil, phases, policy, + pycompat, util, ) from .utils import dateutil @@ -600,6 +601,16 @@ class obsstore(object): raise ValueError(_('in-marker cycle with %s') % node.hex(prec)) metadata = tuple(sorted(metadata.iteritems())) + for k, v in metadata: + try: + # might be better to reject non-ASCII keys + k.decode('utf-8') + v.decode('utf-8') + except UnicodeDecodeError: + raise error.ProgrammingError( + 'obsstore metadata must be valid UTF-8 sequence ' + '(key = %r, value = %r)' + % (pycompat.bytestr(k), pycompat.bytestr(v))) marker = (bytes(prec), tuple(succs), int(flag), metadata, date, parents) return bool(self.add(transaction, [marker]))