Mercurial > public > mercurial-scm > hg
diff tests/test-commandserver.t @ 35170: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 | 2a774cae3a03 |
children | 8e72f9152c4d |
line wrap: on
line diff
--- a/tests/test-commandserver.t Thu Nov 23 22:04:53 2017 +0900 +++ b/tests/test-commandserver.t Thu Nov 23 22:17:03 2017 +0900 @@ -137,6 +137,20 @@ summary: 1 +check strict parsing of early options: + + >>> import os + >>> from hgclient import check, readchannel, runcommand + >>> os.environ['HGPLAIN'] = '+strictflags' + >>> @check + ... def cwd(server): + ... readchannel(server) + ... runcommand(server, ['log', '-b', '--config=alias.log=!echo pwned', + ... 'default']) + *** runcommand log -b --config=alias.log=!echo pwned default + abort: unknown revision '--config=alias.log=!echo pwned'! + [255] + check that "histedit --commands=-" can read rules from the input channel: >>> import cStringIO