use HOST_NAME_MAX to size buffers for gethostname(2)

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>
This commit is contained in:
René Scharfe 2017-04-18 17:57:42 -04:00 committed by Junio C Hamano
parent c3808ca698
commit da25bdb776
6 changed files with 14 additions and 10 deletions

View 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 const char *lock_repo_for_gc(int force, pid_t* ret_pid)
{ {
static struct lock_file lock; static struct lock_file lock;
char my_host[128]; char my_host[HOST_NAME_MAX + 1];
struct strbuf sb = STRBUF_INIT; struct strbuf sb = STRBUF_INIT;
struct stat st; struct stat st;
uintmax_t pid; 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, fd = hold_lock_file_for_update(&lock, pidfile_path,
LOCK_DIE_ON_ERROR); LOCK_DIE_ON_ERROR);
if (!force) { if (!force) {
static char locking_host[128]; static char locking_host[HOST_NAME_MAX + 1];
static char *scan_fmt;
int should_exit; int should_exit;
if (!scan_fmt)
scan_fmt = xstrfmt("%s %%%dc", "%"SCNuMAX, HOST_NAME_MAX);
fp = fopen(pidfile_path, "r"); fp = fopen(pidfile_path, "r");
memset(locking_host, 0, sizeof(locking_host)); memset(locking_host, 0, sizeof(locking_host));
should_exit = should_exit =
@ -256,7 +260,7 @@ static const char *lock_repo_for_gc(int force, pid_t* ret_pid)
* running. * running.
*/ */
time(NULL) - st.st_mtime <= 12 * 3600 && 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 */ /* be gentle to concurrent "gc" on remote hosts */
(strcmp(locking_host, my_host) || !kill(pid, 0) || errno == EPERM); (strcmp(locking_host, my_host) || !kill(pid, 0) || errno == EPERM);
if (fp != NULL) if (fp != NULL)

View File

@ -1655,7 +1655,7 @@ static const char *unpack(int err_fd, struct shallow_info *si)
if (status) if (status)
return "unpack-objects abnormal exit"; return "unpack-objects abnormal exit";
} else { } else {
char hostname[256]; char hostname[HOST_NAME_MAX + 1];
argv_array_pushl(&child.args, "index-pack", argv_array_pushl(&child.args, "index-pack",
"--stdin", hdr_arg, NULL); "--stdin", hdr_arg, NULL);

View File

@ -4,10 +4,6 @@
#include "strbuf.h" #include "strbuf.h"
#include "string-list.h" #include "string-list.h"
#ifndef HOST_NAME_MAX
#define HOST_NAME_MAX 256
#endif
#ifdef NO_INITGROUPS #ifdef NO_INITGROUPS
#define initgroups(x, y) (0) /* nothing */ #define initgroups(x, y) (0) /* nothing */
#endif #endif

View File

@ -745,7 +745,7 @@ static int get_pack(struct fetch_pack_args *args,
if (args->use_thin_pack) if (args->use_thin_pack)
argv_array_push(&cmd.args, "--fix-thin"); argv_array_push(&cmd.args, "--fix-thin");
if (args->lock_pack || unpack_limit) { if (args->lock_pack || unpack_limit) {
char hostname[256]; char hostname[HOST_NAME_MAX + 1];
if (gethostname(hostname, sizeof(hostname))) if (gethostname(hostname, sizeof(hostname)))
xsnprintf(hostname, sizeof(hostname), "localhost"); xsnprintf(hostname, sizeof(hostname), "localhost");
argv_array_pushf(&cmd.args, argv_array_pushf(&cmd.args,

View File

@ -878,6 +878,10 @@ static inline size_t xsize_t(off_t len)
__attribute__((format (printf, 3, 4))) __attribute__((format (printf, 3, 4)))
extern int xsnprintf(char *dst, size_t max, const char *fmt, ...); 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 */ /* in ctype.c, for kwset users */
extern const unsigned char tolower_trans_tbl[256]; extern const unsigned char tolower_trans_tbl[256];

View File

@ -120,7 +120,7 @@ static int canonical_name(const char *host, struct strbuf *out)
static void add_domainname(struct strbuf *out, int *is_bogus) static void add_domainname(struct strbuf *out, int *is_bogus)
{ {
char buf[1024]; char buf[HOST_NAME_MAX + 1];
if (gethostname(buf, sizeof(buf))) { if (gethostname(buf, sizeof(buf))) {
warning_errno("cannot get host name"); warning_errno("cannot get host name");