From 1b1982e9af82b3d35307b2b716651257d69c15e3 Mon Sep 17 00:00:00 2001
From: Petr Pudlak <petr.mvd@gmail.com>
Date: Fri, 12 Apr 2013 16:21:16 +0200
Subject: [PATCH] Let has_cachedir_tag use `malloc` instead of a buffer on the
 stack.

---
 src/exclude.c | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)

diff --git a/src/exclude.c b/src/exclude.c
index 97975c0..80425ec 100644
--- a/src/exclude.c
+++ b/src/exclude.c
@@ -104,16 +104,23 @@ void exclude_clear() {
  * Exclusion of directories that contain only cached information.
  * See http://www.brynosaurus.com/cachedir/
  */
+#define CACHEDIR_TAG_FILENAME "CACHEDIR.TAG"
 #define CACHEDIR_TAG_SIGNATURE "Signature: 8a477f597d28d172789f06886806bc55"
 
 int has_cachedir_tag(const char *name) {
-  char buf[1024];
+  int path_l;
+  char *path;
+  const int signature_l = sizeof CACHEDIR_TAG_SIGNATURE - 1;
+  char buf[signature_l];
   FILE *f;
   int match = 0;
-  const int signature_l = sizeof CACHEDIR_TAG_SIGNATURE - 1;
 
-  snprintf(buf, sizeof(buf), "%s/CACHEDIR.TAG", name);
-  f = fopen(buf, "rb");
+  path_l = strlen(name) + sizeof CACHEDIR_TAG_FILENAME + 2;
+  path = malloc(path_l);
+  snprintf(path, path_l, "%s/%s", name, CACHEDIR_TAG_FILENAME);
+  f = fopen(path, "rb");
+  free(path);
+
   if(f != NULL) {
     match = ((fread(buf, 1, signature_l, f) == signature_l) &&
                 !memcmp(buf, CACHEDIR_TAG_SIGNATURE, signature_l));
-- 
GitLab