--- a/mercurial/url.py Wed Mar 30 20:00:24 2011 -0700
+++ b/mercurial/url.py Wed Mar 30 20:01:31 2011 -0700
@@ -140,6 +140,11 @@
self.host, self.port = self.host.rsplit(':', 1)
if not self.host:
self.host = None
+
+ if (self.host and self.scheme == 'file' and
+ self.host not in ('localhost', '127.0.0.1', '[::1]')):
+ raise util.Abort(_('file:// URLs can only refer to localhost'))
+
self.path = path
for a in ('user', 'passwd', 'host', 'port',
--- a/tests/test-pull.t Wed Mar 30 20:00:24 2011 -0700
+++ b/tests/test-pull.t Wed Mar 30 20:01:31 2011 -0700
@@ -78,4 +78,8 @@
$ URL=`python -c "import os; print 'file://foobar' + ('/' + os.getcwd().replace(os.sep, '/')).replace('//', '/') + '/../test'"`
$ hg pull -q "$URL"
+ abort: file:// URLs can only refer to localhost
+ [255]
+ $ URL=`python -c "import os; print 'file://localhost' + ('/' + os.getcwd().replace(os.sep, '/')).replace('//', '/') + '/../test'"`
+ $ hg pull -q "$URL"
--- a/tests/test-url.py Wed Mar 30 20:00:24 2011 -0700
+++ b/tests/test-url.py Wed Mar 30 20:01:31 2011 -0700
@@ -158,6 +158,13 @@
>>> url('/x///z/y/')
<url path: '/x///z/y/'>
+ Non-localhost file URL:
+
+ >>> u = url('file://mercurial.selenic.com/foo')
+ Traceback (most recent call last):
+ File "<stdin>", line 1, in ?
+ Abort: file:// URLs can only refer to localhost
+
Empty URL:
>>> u = url('')