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:
parent
c3808ca698
commit
da25bdb776
10
builtin/gc.c
10
builtin/gc.c
@ -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)
|
||||||
|
@ -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);
|
||||||
|
4
daemon.c
4
daemon.c
@ -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
|
||||||
|
@ -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,
|
||||||
|
@ -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];
|
||||||
|
|
||||||
|
2
ident.c
2
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)
|
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");
|
||||||
|
Loading…
Reference in New Issue
Block a user