patches: add yet another loose objects alternates fix
[git-osx-installer.git] / patches / km / sha1-file-fix-too.txt
blob32701c9c8ce8280b6b2722feed49c73d5a6a67d6
1 From d0464ec2266d16935f4552f09e76b27cb9d587c2 Mon Sep 17 00:00:00 2001
2 From: "Kyle J. McKay" <mackyle@gmail.com>
3 Date: Sun, 8 Feb 2015 14:19:45 -0800
4 Subject: [PATCH] sha1_file.c: make sure open_sha1_file does not open a
5  directory
7 Since "sha1_file: fix iterating loose alternate objects", it's possible
8 for the base member of the alt_odb_list structure to be NUL terminated
9 rather than ending with a '/' when open_sha1_file is called.
11 Unfortunately this causes a directory to be passed to git_open_noatime
12 instead of a file which it happily opens and returns whereupon this
13 open directory file handle is then passed to mmap.
15 mmap does not like this and fails with an invalid argument error
16 at which point the pack-objects process dies prematurely.
18 To avoid this we preserve the last character of the base member,
19 set it to '/', make the git_open_noatime call and then restore
20 it to its previous value which allows pack-objects to function properly.
22 Signed-off-by: Kyle J. McKay <mackyle@gmail.com>
23 ---
24  sha1_file.c | 3 +++
25  1 file changed, 3 insertions(+)
27 diff --git a/sha1_file.c b/sha1_file.c
28 index f575b3cf..235f6ad8 100644
29 --- a/sha1_file.c
30 +++ b/sha1_file.c
31 @@ -1491,8 +1491,11 @@ static int open_sha1_file(const unsigned char *sha1)
33         prepare_alt_odb();
34         for (alt = alt_odb_list; alt; alt = alt->next) {
35 +               char c = alt->name[-1];
36 +               alt->name[-1] = '/';
37                 fill_sha1_path(alt->name, sha1);
38                 fd = git_open_noatime(alt->base);
39 +               alt->name[-1] = c;
40                 if (fd >= 0)
41                         return fd;
42                 if (most_interesting_errno == ENOENT)