Handle invalid ref that pretends to be a sub-folder under a valid ref
authorKS Chan <mrkschan@gmail.com>
Thu, 13 Dec 2018 14:33:24 +0000 (22:33 +0800)
committerJelmer Vernooij <jelmer@jelmer.uk>
Sat, 15 Dec 2018 13:10:53 +0000 (13:10 +0000)
dulwich/refs.py
dulwich/tests/test_refs.py

index 7c44bd5f9865309f1664757b2f983468597bf3d4..000bb515dba4de87af9bb2fb802157a090713088 100644 (file)
@@ -617,7 +617,7 @@ class DiskRefsContainer(RefsContainer):
                     # Read only the first 40 bytes
                     return header + f.read(40 - len(SYMREF))
         except IOError as e:
-            if e.errno in (errno.ENOENT, errno.EISDIR):
+            if e.errno in (errno.ENOENT, errno.EISDIR, errno.ENOTDIR):
                 return None
             raise
 
index e1b036640bbe5be543af817b6990e0cc88dc7383..2898f1a3da880d28bfb3d0c977d9e322734945b3 100644 (file)
@@ -486,6 +486,13 @@ class DiskRefsContainerTests(RefsContainerTests, TestCase):
                          self._refs.read_ref(b'refs/heads/packed'))
         self.assertEqual(None, self._refs.read_ref(b'nonexistant'))
 
+    def test_read_loose_ref(self):
+        self._refs[b'refs/heads/foo'] = (
+            b'df6800012397fb85c56e7418dd4eb9405dee075c'
+        )
+
+        self.assertEqual(None, self._refs.read_ref(b'refs/heads/foo/bar'))
+
     def test_non_ascii(self):
         try:
             encoded_ref = u'refs/tags/schön'.encode(