summaryrefslogtreecommitdiff
path: root/attr.h
diff options
context:
space:
mode:
authorPatrick Steinhardt <ps@pks.im>2022-12-01 15:45:53 +0100
committerJunio C Hamano <gitster@pobox.com>2022-12-05 15:50:03 +0900
commit3c50032ff5289cc45659f21949c8d09e52164579 (patch)
tree2d9a9379e7d94be5d8ad773466c90a76b79034d5 /attr.h
parentdfa6b32b5e599d97448337ed4fc18dd50c90758f (diff)
downloadgit-3c50032ff5289cc45659f21949c8d09e52164579.tar.gz
attr: ignore overly large gitattributes files
Similar as with the preceding commit, start ignoring gitattributes files that are overly large to protect us against out-of-bounds reads and writes caused by integer overflows. Unfortunately, we cannot just define "overly large" in terms of any preexisting limits in the codebase. Instead, we choose a very conservative limit of 100MB. This is plenty of room for specifying gitattributes, and incidentally it is also the limit for blob sizes for GitHub. While we don't want GitHub to dictate limits here, it is still sensible to use this fact for an informed decision given that it is hosting a huge set of repositories. Furthermore, over at GitLab we scanned a subset of repositories for their root-level attribute files. We found that 80% of them have a gitattributes file smaller than 100kB, 99.99% have one smaller than 1MB, and only a single repository had one that was almost 3MB in size. So enforcing a limit of 100MB seems to give us ample of headroom. With this limit in place we can be reasonably sure that there is no easy way to exploit the gitattributes file via integer overflows anymore. Furthermore, it protects us against resource exhaustion caused by allocating the in-memory data structures required to represent the parsed attributes. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'attr.h')
-rw-r--r--attr.h6
1 files changed, 6 insertions, 0 deletions
diff --git a/attr.h b/attr.h
index df9a75da55..5970f930fd 100644
--- a/attr.h
+++ b/attr.h
@@ -113,6 +113,12 @@
*/
#define ATTR_MAX_LINE_LENGTH 2048
+ /**
+ * The maximum size of the giattributes file. If the file exceeds this size we
+ * will ignore it.
+ */
+#define ATTR_MAX_FILE_SIZE (100 * 1024 * 1024)
+
struct index_state;
/**