We've been avoiding PATH_MAX whenever possible. This patch avoids
PATH_MAX in get_pathname() and gives it enough room not to worry about
really long paths.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclo...@gmail.com>
---
 path.c | 28 ++++++++++++++++------------
 1 file changed, 16 insertions(+), 12 deletions(-)

diff --git a/path.c b/path.c
index 24594c4..4c1c144 100644
--- a/path.c
+++ b/path.c
@@ -16,10 +16,11 @@ static int get_st_mode_bits(const char *path, int *mode)
 
 static char bad_path[] = "/bad-path/";
 
-static char *get_pathname(void)
+static char *get_pathname(size_t *len)
 {
-       static char pathname_array[4][PATH_MAX];
+       static char pathname_array[4][4096];
        static int index;
+       *len = sizeof(pathname_array[0]);
        return pathname_array[3 & ++index];
 }
 
@@ -108,24 +109,26 @@ char *mkpath(const char *fmt, ...)
 {
        va_list args;
        unsigned len;
-       char *pathname = get_pathname();
+       size_t n;
+       char *pathname = get_pathname(&n);
 
        va_start(args, fmt);
-       len = vsnprintf(pathname, PATH_MAX, fmt, args);
+       len = vsnprintf(pathname, n, fmt, args);
        va_end(args);
-       if (len >= PATH_MAX)
+       if (len >= n)
                return bad_path;
        return cleanup_path(pathname);
 }
 
 char *git_path(const char *fmt, ...)
 {
-       char *pathname = get_pathname();
+       size_t len;
+       char *pathname = get_pathname(&len);
        va_list args;
        char *ret;
 
        va_start(args, fmt);
-       ret = vsnpath(pathname, PATH_MAX, fmt, args);
+       ret = vsnpath(pathname, len, fmt, args);
        va_end(args);
        return ret;
 }
@@ -158,14 +161,15 @@ void home_config_paths(char **global, char **xdg, char 
*file)
 
 char *git_path_submodule(const char *path, const char *fmt, ...)
 {
-       char *pathname = get_pathname();
+       size_t n;
+       char *pathname = get_pathname(&n);
        struct strbuf buf = STRBUF_INIT;
        const char *git_dir;
        va_list args;
        unsigned len;
 
        len = strlen(path);
-       if (len > PATH_MAX-100)
+       if (len > n-100)
                return bad_path;
 
        strbuf_addstr(&buf, path);
@@ -180,7 +184,7 @@ char *git_path_submodule(const char *path, const char *fmt, 
...)
        }
        strbuf_addch(&buf, '/');
 
-       if (buf.len >= PATH_MAX)
+       if (buf.len >= n)
                return bad_path;
        memcpy(pathname, buf.buf, buf.len + 1);
 
@@ -188,9 +192,9 @@ char *git_path_submodule(const char *path, const char *fmt, 
...)
        len = strlen(pathname);
 
        va_start(args, fmt);
-       len += vsnprintf(pathname + len, PATH_MAX - len, fmt, args);
+       len += vsnprintf(pathname + len, n - len, fmt, args);
        va_end(args);
-       if (len >= PATH_MAX)
+       if (len >= n)
                return bad_path;
        return cleanup_path(pathname);
 }
-- 
1.8.5.1.77.g42c48fa

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to