2752: Avoid ResumeCache name collisions from concatenating paths.
authorBrett Smith <brett@curoverse.com>
Fri, 30 May 2014 13:08:50 +0000 (09:08 -0400)
committerBrett Smith <brett@curoverse.com>
Fri, 30 May 2014 14:40:10 +0000 (10:40 -0400)
sdk/python/arvados/commands/put.py
sdk/python/tests/test_arv-put.py

index 3229125887be918a79e68c5740a84f7d9aba3c66..12f464e6055cb9f76b8701c34808a4eed7392c1d 100644 (file)
@@ -172,7 +172,7 @@ class ResumeCache(object):
         md5 = hashlib.md5()
         md5.update(arvados.config.get('ARVADOS_API_HOST', '!nohost'))
         realpaths = sorted(os.path.realpath(path) for path in args.paths)
-        md5.update(''.join(realpaths))
+        md5.update('\0'.join(realpaths))
         if any(os.path.isdir(path) for path in realpaths):
             md5.update(str(max(args.max_manifest_depth, -1)))
         elif args.filename:
index 41fb33041a5c82353de969bafb414759f9d36132..b19e1c5b38750a8600822e1ceddd6368a5d11a0b 100644 (file)
@@ -65,6 +65,12 @@ class ArvadosPutResumeCacheTest(ArvadosBaseTestCase):
             self.cache_path_from_arglist(['-', '--filename', 'stdin']),
             self.cache_path_from_arglist(['--filename', 'stdin', '-']))
 
+    def test_cache_names_differ_for_similar_paths(self):
+        # This test needs names at / that don't exist on the real filesystem.
+        self.assertNotEqual(
+            self.cache_path_from_arglist(['/_arvputtest1', '/_arvputtest2']),
+            self.cache_path_from_arglist(['/_arvputtest1/_arvputtest2']))
+
     def test_cache_names_ignore_irrelevant_arguments(self):
         # Workaround: parse_arguments bails on --filename with a directory.
         path1 = self.cache_path_from_arglist(['/tmp'])