[PATCH] bundle2: enforce parttype as alphanumerical
Augie Fackler
raf at durin42.com
Fri Jan 16 10:01:25 CST 2015
On Fri, Jan 16, 2015 at 02:30:33AM -0800, Pierre-Yves David wrote:
> # HG changeset patch
> # User Pierre-Yves David <pierre-yves.david at fb.com>
> # Date 1418958841 28800
> # Thu Dec 18 19:14:01 2014 -0800
> # Node ID 0f1be09c71fcc524eb66815003752abc41477587
> # Parent 81349f4b47f4c793873290852808ff095ab24c00
> bundle2: enforce parttype as alphanumerical
Queued this, thanks.
>
> The binary format description have always state that the parttype should simple,
> but it was never really enforced. Recent discussion have convinced me we want to
> keep the part type simple and easy to debug. There is enough extensibility in
> the rest of the format.
>
> diff --git a/mercurial/bundle2.py b/mercurial/bundle2.py
> --- a/mercurial/bundle2.py
> +++ b/mercurial/bundle2.py
> @@ -83,11 +83,11 @@ Binary format is as follow
>
> The binary format of the header is has follow
>
> :typesize: (one byte)
>
> - :parttype: alphanumerical part name
> + :parttype: alphanumerical part name (restricted to ^a-zA-Z0-9_:-])
>
> :partid: A 32bits integer (unique in the bundle) that can be used to refer
> to this part.
>
> :parameters:
> @@ -151,10 +151,11 @@ import struct
> import urllib
> import string
> import obsolete
> import pushkey
> import url
> +import re
>
> import changegroup, error
> from i18n import _
>
> _pack = struct.pack
> @@ -169,10 +170,17 @@ from i18n import _
> _fpayloadsize = '>i'
> _fpartparamcount = '>BB'
>
> preferedchunksize = 4096
>
> +_parttypeforbidden = re.compile('[^a-zA-Z0-9_:-]')
> +
> +def validateparttype(parttype):
> + """raise ValueError if a parttype contains invalid character"""
> + if _parttypeforbidden.match(parttype):
> + raise ValueError(parttype)
> +
> def _makefpartparamsizes(nbparams):
> """return a struct format to read part parameter sizes
>
> The number parameters is variable so we need to build that format
> dynamically.
> @@ -189,10 +197,11 @@ def parthandler(parttype, params=()):
> @parthandler('myparttype', ('mandatory', 'param', 'handled'))
> def myparttypehandler(...):
> '''process a part of type "my part".'''
> ...
> """
> + validateparttype(parttype)
> def _decorator(func):
> lparttype = parttype.lower() # enforce lower case matching.
> assert lparttype not in parthandlermapping
> parthandlermapping[lparttype] = func
> func.params = frozenset(params)
> @@ -588,10 +597,11 @@ class bundlepart(object):
> Both data and parameters cannot be modified after the generation has begun.
> """
>
> def __init__(self, parttype, mandatoryparams=(), advisoryparams=(),
> data='', mandatory=True):
> + validateparttype(parttype)
> self.id = None
> self.type = parttype
> self._data = data
> self._mandatoryparams = list(mandatoryparams)
> self._advisoryparams = list(advisoryparams)
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel
More information about the Mercurial-devel
mailing list