summaryrefslogtreecommitdiff
path: root/sha1_file.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2017-10-23 05:40:00 (GMT)
committerJunio C Hamano <gitster@pobox.com>2017-10-23 05:40:00 (GMT)
commit95c1a7963099ff5fec5e2445c29ba7565bd149b0 (patch)
treea96c9614746a471683afc0cd26653daabe8e44a6 /sha1_file.c
parent9fc7bc656858ef1b2d8f18856af59e23cda489d8 (diff)
parentf0f7bebef73346a12aa1e22cf5264cbc241ab069 (diff)
downloadgit-95c1a7963099ff5fec5e2445c29ba7565bd149b0.zip
git-95c1a7963099ff5fec5e2445c29ba7565bd149b0.tar.gz
git-95c1a7963099ff5fec5e2445c29ba7565bd149b0.tar.bz2
Merge branch 'jk/info-alternates-fix' into maint
A regression fix for 2.11 that made the code to read the list of alternate object stores overrun the end of the string. * jk/info-alternates-fix: read_info_alternates: warn on non-trivial errors read_info_alternates: read contents into strbuf
Diffstat (limited to 'sha1_file.c')
-rw-r--r--sha1_file.c31
1 files changed, 11 insertions, 20 deletions
diff --git a/sha1_file.c b/sha1_file.c
index 4d0e0c5..bd5f82e 100644
--- a/sha1_file.c
+++ b/sha1_file.c
@@ -422,7 +422,7 @@ static const char *parse_alt_odb_entry(const char *string,
return end;
}
-static void link_alt_odb_entries(const char *alt, int len, int sep,
+static void link_alt_odb_entries(const char *alt, int sep,
const char *relative_base, int depth)
{
struct strbuf objdirbuf = STRBUF_INIT;
@@ -451,28 +451,19 @@ static void link_alt_odb_entries(const char *alt, int len, int sep,
static void read_info_alternates(const char * relative_base, int depth)
{
- char *map;
- size_t mapsz;
- struct stat st;
char *path;
- int fd;
+ struct strbuf buf = STRBUF_INIT;
path = xstrfmt("%s/info/alternates", relative_base);
- fd = git_open(path);
- free(path);
- if (fd < 0)
- return;
- if (fstat(fd, &st) || (st.st_size == 0)) {
- close(fd);
+ if (strbuf_read_file(&buf, path, 1024) < 0) {
+ warn_on_fopen_errors(path);
+ free(path);
return;
}
- mapsz = xsize_t(st.st_size);
- map = xmmap(NULL, mapsz, PROT_READ, MAP_PRIVATE, fd, 0);
- close(fd);
-
- link_alt_odb_entries(map, mapsz, '\n', relative_base, depth);
- munmap(map, mapsz);
+ link_alt_odb_entries(buf.buf, '\n', relative_base, depth);
+ strbuf_release(&buf);
+ free(path);
}
struct alternate_object_database *alloc_alt_odb(const char *dir)
@@ -527,7 +518,7 @@ void add_to_alternates_file(const char *reference)
if (commit_lock_file(lock))
die_errno("unable to move new alternates file into place");
if (alt_odb_tail)
- link_alt_odb_entries(reference, strlen(reference), '\n', NULL, 0);
+ link_alt_odb_entries(reference, '\n', NULL, 0);
}
free(alts);
}
@@ -540,7 +531,7 @@ void add_to_alternates_memory(const char *reference)
*/
prepare_alt_odb();
- link_alt_odb_entries(reference, strlen(reference), '\n', NULL, 0);
+ link_alt_odb_entries(reference, '\n', NULL, 0);
}
/*
@@ -643,7 +634,7 @@ void prepare_alt_odb(void)
if (!alt) alt = "";
alt_odb_tail = &alt_odb_list;
- link_alt_odb_entries(alt, strlen(alt), PATH_SEP, NULL, 0);
+ link_alt_odb_entries(alt, PATH_SEP, NULL, 0);
read_info_alternates(get_object_directory(), 0);
}