diff options
author | Junio C Hamano <gitster@pobox.com> | 2017-04-24 07:07:57 +0200 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2017-04-24 07:07:57 +0200 |
commit | 5938454cbc585e0f4bdd9f1cc87c6886a3c1bff3 (patch) | |
tree | 72bb28f592f0b3207fcfb25f243287ca6e4b18c3 /builtin | |
parent | Merge branch 'jk/ls-files-recurse-submodules-fix' (diff) | |
parent | xgethostname: handle long hostnames (diff) | |
download | git-5938454cbc585e0f4bdd9f1cc87c6886a3c1bff3.tar.xz git-5938454cbc585e0f4bdd9f1cc87c6886a3c1bff3.zip |
Merge branch 'dt/xgethostname-nul-termination'
gethostname(2) may not NUL terminate the buffer if hostname does
not fit; unfortunately there is no easy way to see if our buffer
was too small, but at least this will make sure we will not end up
using garbage past the end of the buffer.
* dt/xgethostname-nul-termination:
xgethostname: handle long hostnames
use HOST_NAME_MAX to size buffers for gethostname(2)
Diffstat (limited to 'builtin')
-rw-r--r-- | builtin/gc.c | 12 | ||||
-rw-r--r-- | builtin/receive-pack.c | 4 |
2 files changed, 10 insertions, 6 deletions
diff --git a/builtin/gc.c b/builtin/gc.c index 2daede7820..91f7696a85 100644 --- a/builtin/gc.c +++ b/builtin/gc.c @@ -232,7 +232,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; @@ -244,15 +244,19 @@ static const char *lock_repo_for_gc(int force, pid_t* ret_pid) /* already locked */ return NULL; - if (gethostname(my_host, sizeof(my_host))) + if (xgethostname(my_host, sizeof(my_host))) xsnprintf(my_host, sizeof(my_host), "unknown"); pidfile_path = git_pathdup("gc.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 = @@ -268,7 +272,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) diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c index 7f484e7f6b..f96834f42c 100644 --- a/builtin/receive-pack.c +++ b/builtin/receive-pack.c @@ -1697,12 +1697,12 @@ 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", NULL); push_header_arg(&child.args, &hdr); - if (gethostname(hostname, sizeof(hostname))) + if (xgethostname(hostname, sizeof(hostname))) xsnprintf(hostname, sizeof(hostname), "localhost"); argv_array_pushf(&child.args, "--keep=receive-pack %"PRIuMAX" on %s", |