Skip to content

Commit

Permalink
read_info_alternates: handle paths larger than PATH_MAX
Browse files Browse the repository at this point in the history
This function assumes that the relative_base path passed
into it is no larger than PATH_MAX, and writes into a
fixed-size buffer. However, this path may not have actually
come from the filesystem; for example, add_submodule_odb
generates a path using a strbuf and passes it in. This is
hard to trigger in practice, though, because the long
submodule directory would have to exist on disk before we
would try to open its info/alternates file.

We can easily avoid the bug, though, by simply creating the
filename on the heap.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Jeff King authored and Junio C Hamano committed Sep 4, 2015
1 parent c29edfe commit 5015f01
Showing 1 changed file with 3 additions and 6 deletions.
9 changes: 3 additions & 6 deletions sha1_file.c
Original file line number Diff line number Diff line change
Expand Up @@ -377,15 +377,12 @@ void read_info_alternates(const char * relative_base, int depth)
char *map;
size_t mapsz;
struct stat st;
const char alt_file_name[] = "info/alternates";
/* Given that relative_base is no longer than PATH_MAX,
ensure that "path" has enough space to append "/", the
file name, "info/alternates", and a trailing NUL. */
char path[PATH_MAX + 1 + sizeof alt_file_name];
char *path;
int fd;

sprintf(path, "%s/%s", relative_base, alt_file_name);
path = xstrfmt("%s/info/alternates", relative_base);
fd = git_open_noatime(path);
free(path);
if (fd < 0)
return;
if (fstat(fd, &st) || (st.st_size == 0)) {
Expand Down

0 comments on commit 5015f01

Please sign in to comment.