12803: Accept unescaped colons in filenames.
authorTom Clegg <tclegg@veritasgenetics.com>
Tue, 12 Dec 2017 16:29:37 +0000 (11:29 -0500)
committerTom Clegg <tclegg@veritasgenetics.com>
Tue, 12 Dec 2017 16:29:37 +0000 (11:29 -0500)
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg@veritasgenetics.com>

sdk/go/arvados/collection_fs.go
sdk/go/arvados/collection_fs_test.go

index 28629e33b20f31189ac460d02ab2868fdd85db96..7bbbaa492c71298157f3cfebc96dfade89966ae0 100644 (file)
@@ -864,7 +864,7 @@ func (dn *dirnode) loadManifest(txt string) error {
                                return fmt.Errorf("line %d: bad locator %q", lineno, token)
                        }
 
-                       toks := strings.Split(token, ":")
+                       toks := strings.SplitN(token, ":", 3)
                        if len(toks) != 3 {
                                return fmt.Errorf("line %d: bad file segment %q", lineno, token)
                        }
index f1a34754f732bd9d94a2589e72aef164424827b1..57ba3255947439ded25834e6b8841cd51fe70f48 100644 (file)
@@ -77,6 +77,21 @@ func (s *CollectionFSSuite) TestHttpFileSystemInterface(c *check.C) {
        c.Check(ok, check.Equals, true)
 }
 
+func (s *CollectionFSSuite) TestColonInFilename(c *check.C) {
+       fs, err := (&Collection{
+               ManifestText: "./foo:foo 3858f62230ac3c915f300c664312c63f+3 0:3:bar:bar\n",
+       }).FileSystem(s.client, s.kc)
+       c.Assert(err, check.IsNil)
+
+       f, err := fs.Open("/foo:foo")
+       c.Assert(err, check.IsNil)
+
+       fis, err := f.Readdir(0)
+       c.Check(err, check.IsNil)
+       c.Check(len(fis), check.Equals, 1)
+       c.Check(fis[0].Name(), check.Equals, "bar:bar")
+}
+
 func (s *CollectionFSSuite) TestReaddirFull(c *check.C) {
        f, err := s.fs.Open("/dir1")
        c.Assert(err, check.IsNil)
@@ -928,7 +943,7 @@ func (s *CollectionFSSuite) TestBrokenManifests(c *check.C) {
                ".  0:0:foo\n",
                ". 0:0:foo 0:0:bar\n",
                ". d41d8cd98f00b204e9800998ecf8427e 0:0:foo\n",
-               ". d41d8cd98f00b204e9800998ecf8427e+0 0:0:foo:bar\n",
+               ". d41d8cd98f00b204e9800998ecf8427e+0 :0:0:foo\n",
                ". d41d8cd98f00b204e9800998ecf8427e+0 foo:0:foo\n",
                ". d41d8cd98f00b204e9800998ecf8427e+0 0:foo:foo\n",
                ". d41d8cd98f00b204e9800998ecf8427e+1 0:1:foo 1:1:bar\n",