]> git.ipfire.org Git - thirdparty/git.git/commitdiff
use HOST_NAME_MAX to size buffers for gethostname(2)
authorRené Scharfe <l.s.r@web.de>
Tue, 18 Apr 2017 21:57:42 +0000 (17:57 -0400)
committerJunio C Hamano <gitster@pobox.com>
Wed, 19 Apr 2017 02:57:41 +0000 (19:57 -0700)
POSIX limits the length of host names to HOST_NAME_MAX.  Export the
fallback definition from daemon.c and use this constant to make all
buffers used with gethostname(2) big enough for any possible result
and a terminating NUL.

Inspired-by: David Turner <dturner@twosigma.com>
Signed-off-by: Rene Scharfe <l.s.r@web.de>
Signed-off-by: David Turner <dturner@twosigma.com>
Reviewed-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/gc.c
builtin/receive-pack.c
daemon.c
fetch-pack.c
git-compat-util.h
ident.c

index 069950d0b417f5eb97cd756ae32df7a2fb13abce..5befd518fd1616c606efef9e4be15d6283811530 100644 (file)
@@ -220,7 +220,7 @@ static int need_to_gc(void)
 static const char *lock_repo_for_gc(int force, pid_t* ret_pid)
 {
        static struct lock_file lock;
-       char my_host[128];
+       char my_host[HOST_NAME_MAX + 1];
        struct strbuf sb = STRBUF_INIT;
        struct stat st;
        uintmax_t pid;
@@ -239,8 +239,12 @@ static const char *lock_repo_for_gc(int force, pid_t* ret_pid)
        fd = hold_lock_file_for_update(&lock, pidfile_path,
                                       LOCK_DIE_ON_ERROR);
        if (!force) {
-               static char locking_host[128];
+               static char locking_host[HOST_NAME_MAX + 1];
+               static char *scan_fmt;
                int should_exit;
+
+               if (!scan_fmt)
+                       scan_fmt = xstrfmt("%s %%%dc", "%"SCNuMAX, HOST_NAME_MAX);
                fp = fopen(pidfile_path, "r");
                memset(locking_host, 0, sizeof(locking_host));
                should_exit =
@@ -256,7 +260,7 @@ static const char *lock_repo_for_gc(int force, pid_t* ret_pid)
                         * running.
                         */
                        time(NULL) - st.st_mtime <= 12 * 3600 &&
-                       fscanf(fp, "%"SCNuMAX" %127c", &pid, locking_host) == 2 &&
+                       fscanf(fp, scan_fmt, &pid, locking_host) == 2 &&
                        /* be gentle to concurrent "gc" on remote hosts */
                        (strcmp(locking_host, my_host) || !kill(pid, 0) || errno == EPERM);
                if (fp != NULL)
index 011db00d31709408a21b97abfb5742b97b54238d..3ca8ebe0e10a559a8036e5705df684b110e3b641 100644 (file)
@@ -1655,7 +1655,7 @@ static const char *unpack(int err_fd, struct shallow_info *si)
                if (status)
                        return "unpack-objects abnormal exit";
        } else {
-               char hostname[256];
+               char hostname[HOST_NAME_MAX + 1];
 
                argv_array_pushl(&child.args, "index-pack",
                                 "--stdin", hdr_arg, NULL);
index ff0fa583b0497d886c54ff93d97cc45fd909e7a5..10cbc0fa5808d77d16b501371b6dde9f505b1e6e 100644 (file)
--- a/daemon.c
+++ b/daemon.c
@@ -4,10 +4,6 @@
 #include "strbuf.h"
 #include "string-list.h"
 
-#ifndef HOST_NAME_MAX
-#define HOST_NAME_MAX 256
-#endif
-
 #ifdef NO_INITGROUPS
 #define initgroups(x, y) (0) /* nothing */
 #endif
index 413937e7404d163883d5d0456ebefc4e1504cd87..a75ed6c940406cfe4befc6dbc61845f6af12cfc1 100644 (file)
@@ -745,7 +745,7 @@ static int get_pack(struct fetch_pack_args *args,
                if (args->use_thin_pack)
                        argv_array_push(&cmd.args, "--fix-thin");
                if (args->lock_pack || unpack_limit) {
-                       char hostname[256];
+                       char hostname[HOST_NAME_MAX + 1];
                        if (gethostname(hostname, sizeof(hostname)))
                                xsnprintf(hostname, sizeof(hostname), "localhost");
                        argv_array_pushf(&cmd.args,
index d89a78616b6934a529473080df97990bfb8632e1..1f1e82407e1e93dbe7e47b94ca4aef01d4910d08 100644 (file)
@@ -878,6 +878,10 @@ static inline size_t xsize_t(off_t len)
 __attribute__((format (printf, 3, 4)))
 extern int xsnprintf(char *dst, size_t max, const char *fmt, ...);
 
+#ifndef HOST_NAME_MAX
+#define HOST_NAME_MAX 256
+#endif
+
 /* in ctype.c, for kwset users */
 extern const unsigned char tolower_trans_tbl[256];
 
diff --git a/ident.c b/ident.c
index d17b5bd341eccd604c849201fb1f13153be9736e..8ec0f25987540ccf64230b6aad4c6e2323d43455 100644 (file)
--- a/ident.c
+++ b/ident.c
@@ -120,7 +120,7 @@ static int canonical_name(const char *host, struct strbuf *out)
 
 static void add_domainname(struct strbuf *out, int *is_bogus)
 {
-       char buf[1024];
+       char buf[HOST_NAME_MAX + 1];
 
        if (gethostname(buf, sizeof(buf))) {
                warning_errno("cannot get host name");