From 17d990542eb83db05aca76cc369ff4af6fcfd7ae Mon Sep 17 00:00:00 2001 From: KS Chan Date: Thu, 13 Dec 2018 22:33:24 +0800 Subject: [PATCH] Handle invalid ref that pretends to be a sub-folder under a valid ref --- dulwich/refs.py | 2 +- dulwich/tests/test_refs.py | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/dulwich/refs.py b/dulwich/refs.py index 7c44bd5f..000bb515 100644 --- a/dulwich/refs.py +++ b/dulwich/refs.py @@ -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 diff --git a/dulwich/tests/test_refs.py b/dulwich/tests/test_refs.py index e1b03664..2898f1a3 100644 --- a/dulwich/tests/test_refs.py +++ b/dulwich/tests/test_refs.py @@ -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( -- 2.34.1