From patchwork Sun Oct 1 14:40:15 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: D865: obsmarker: crash more helpfully when metadata fields are >255 bytes (issue5681) From: phabricator X-Patchwork-Id: 24355 Message-Id: <846be1b25d1664f336198f5665b77f5d@localhost.localdomain> To: mercurial-devel@mercurial-scm.org Date: Sun, 1 Oct 2017 14:40:15 +0000 This revision was automatically updated to reflect the committed changes. Closed by commit rHGb6692ba7d5b0: obsmarker: crash more helpfully when metadata fields are >255bytes (issue5681) (authored by swhitaker, committed by ). CHANGED PRIOR TO COMMIT https://phab.mercurial-scm.org/D865?vs=2255&id=2294#toc REPOSITORY rHG Mercurial CHANGES SINCE LAST UPDATE https://phab.mercurial-scm.org/D865?vs=2255&id=2294 REVISION DETAIL https://phab.mercurial-scm.org/D865 AFFECTED FILES mercurial/obsolete.py tests/test-obsolete-bounds-checking.t CHANGE DETAILS To: swhitaker, #hg-reviewers, ikostia, yuja Cc: yuja, pulkit, ikostia, mercurial-devel diff --git a/tests/test-obsolete-bounds-checking.t b/tests/test-obsolete-bounds-checking.t new file mode 100644 --- /dev/null +++ b/tests/test-obsolete-bounds-checking.t @@ -0,0 +1,23 @@ +Create a repo, set the username to something more than 255 bytes, then run hg amend on it. + + $ unset HGUSER + $ cat >> $HGRCPATH << EOF + > [ui] + > username = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + > [extensions] + > amend = + > [experimental] + > stabilization=createmarkers,exchange + > EOF + $ hg init tmpa + $ cd tmpa + $ echo a > a + $ hg add + adding a + $ hg commit -m "Initial commit" + $ echo a >> a + $ hg amend 2>&1 | egrep -v '^(\*\*| )' + transaction abort! + rollback completed + Traceback (most recent call last): + mercurial.error.ProgrammingError: obsstore metadata value cannot be longer than 255 bytes (value "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa " for key "user" is 285 bytes) diff --git a/mercurial/obsolete.py b/mercurial/obsolete.py --- a/mercurial/obsolete.py +++ b/mercurial/obsolete.py @@ -416,6 +416,14 @@ for key, value in metadata: lk = len(key) lv = len(value) + if lk > 255: + msg = ('obsstore metadata key cannot be longer than 255 bytes' + ' (key "%s" is %u bytes)') % (key, lk) + raise error.ProgrammingError(msg) + if lv > 255: + msg = ('obsstore metadata value cannot be longer than 255 bytes' + ' (value "%s" for key "%s" is %u bytes)') % (value, key, lv) + raise error.ProgrammingError(msg) data.append(lk) data.append(lv) totalsize += lk + lv