Mercurial > public > mercurial-scm > hg-stable
diff mercurial/chgserver.py @ 34996:c9740b69b9b7 stable
dispatch: add HGPLAIN=+strictflags to restrict early parsing of global options
If this feature is enabled, early options are parsed using the global options
table. As the parser stops processing options when non/unknown option is
encountered, it won't mistakenly take an option value as a new early option.
Still "--" can be injected to terminate the parsing (e.g. "hg -R -- log"), I
think it's unlikely to lead to an RCE.
To minimize a risk of this change, new fancyopts.earlygetopt() path is enabled
only when +strictflags is set. Also the strict parser doesn't support '--repo',
a short for '--repository' yet. This limitation will be removed later.
As this feature is backward incompatible, I decided to add a new opt-in
mechanism to HGPLAIN. I'm not pretty sure if this is the right choice, but
I'm thinking of adding +feature/-feature syntax to HGPLAIN. Alternatively,
we could add a new environment variable. Any bikeshedding is welcome.
Note that HGPLAIN=+strictflags doesn't work correctly in chg session since
command arguments are pre-processed in C. This wouldn't be easily fixed.
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Thu, 23 Nov 2017 22:17:03 +0900 |
parents | d3d35a55e03b |
children | 6e6d0a5b88e6 |
line wrap: on
line diff
--- a/mercurial/chgserver.py Thu Nov 23 22:04:53 2017 +0900 +++ b/mercurial/chgserver.py Thu Nov 23 22:17:03 2017 +0900 @@ -220,8 +220,17 @@ newui._csystem = srcui._csystem # command line args - args = args[:] - dispatch._parseconfig(newui, dispatch._earlygetopt(['--config'], args)) + options = {} + if srcui.plain('strictflags'): + options.update(dispatch._earlyparseopts(args)) + else: + args = args[:] + options['config'] = dispatch._earlygetopt(['--config'], args) + cwds = dispatch._earlygetopt(['--cwd'], args) + options['cwd'] = cwds and cwds[-1] or '' + rpath = dispatch._earlygetopt(["-R", "--repository", "--repo"], args) + options['repository'] = rpath and rpath[-1] or '' + dispatch._parseconfig(newui, options['config']) # stolen from tortoisehg.util.copydynamicconfig() for section, name, value in srcui.walkconfig(): @@ -232,10 +241,9 @@ newui.setconfig(section, name, value, source) # load wd and repo config, copied from dispatch.py - cwds = dispatch._earlygetopt(['--cwd'], args) - cwd = cwds and os.path.realpath(cwds[-1]) or None - rpath = dispatch._earlygetopt(["-R", "--repository", "--repo"], args) - rpath = rpath and rpath[-1] or '' + cwd = options['cwd'] + cwd = cwd and os.path.realpath(cwd) or None + rpath = options['repository'] path, newlui = dispatch._getlocal(newui, rpath, wd=cwd) return (newui, newlui)