From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS31976 209.132.180.0/23 X-Spam-Status: No, score=-3.9 required=3.0 tests=AWL,BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,RCVD_IN_DNSWL_HI,RP_MATCHES_RCVD shortcircuit=no autolearn=ham autolearn_force=no version=3.4.0 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by dcvr.yhbt.net (Postfix) with ESMTP id 41CC7207B9 for ; Tue, 18 Apr 2017 21:58:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754844AbdDRV6A (ORCPT ); Tue, 18 Apr 2017 17:58:00 -0400 Received: from sub3.mail.dreamhost.com ([69.163.253.7]:48075 "EHLO homiemail-a12.g.dreamhost.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750766AbdDRV56 (ORCPT ); Tue, 18 Apr 2017 17:57:58 -0400 Received: from homiemail-a12.g.dreamhost.com (localhost [127.0.0.1]) by homiemail-a12.g.dreamhost.com (Postfix) with ESMTP id 985DD26206B; Tue, 18 Apr 2017 14:57:57 -0700 (PDT) Received: from localhost.localdomain (207-38-252-131.c3-0.43d-ubr2.qens-43d.ny.cable.rcn.com [207.38.252.131]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) (Authenticated sender: novalis@novalis.org) by homiemail-a12.g.dreamhost.com (Postfix) with ESMTPSA id 1BDD9262065; Tue, 18 Apr 2017 14:57:57 -0700 (PDT) From: David Turner To: git@vger.kernel.org Cc: l.s.r@web.de, David Turner Subject: [PATCH v3 2/2] xgethostname: handle long hostnames Date: Tue, 18 Apr 2017 17:57:43 -0400 Message-Id: <20170418215743.18406-3-dturner@twosigma.com> X-Mailer: git-send-email 2.11.GIT In-Reply-To: <20170418215743.18406-1-dturner@twosigma.com> References: <20170418215743.18406-1-dturner@twosigma.com> Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org If the full hostname doesn't fit in the buffer supplied to gethostname, POSIX does not specify whether the buffer will be null-terminated, so to be safe, we should do it ourselves. Introduce new function, xgethostname, which ensures that there is always a \0 at the end of the buffer. Signed-off-by: David Turner --- builtin/gc.c | 2 +- builtin/receive-pack.c | 2 +- fetch-pack.c | 2 +- git-compat-util.h | 2 ++ ident.c | 2 +- wrapper.c | 13 +++++++++++++ 6 files changed, 19 insertions(+), 4 deletions(-) diff --git a/builtin/gc.c b/builtin/gc.c index 4c4a36e2b5..33a1edabbc 100644 --- a/builtin/gc.c +++ b/builtin/gc.c @@ -250,7 +250,7 @@ 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"); diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c index 2612efad3d..0ca423a711 100644 --- a/builtin/receive-pack.c +++ b/builtin/receive-pack.c @@ -1700,7 +1700,7 @@ static const char *unpack(int err_fd, struct shallow_info *si) argv_array_pushl(&child.args, "index-pack", "--stdin", hdr_arg, NULL); - 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", diff --git a/fetch-pack.c b/fetch-pack.c index 055f568775..15d59a0440 100644 --- a/fetch-pack.c +++ b/fetch-pack.c @@ -803,7 +803,7 @@ static int get_pack(struct fetch_pack_args *args, argv_array_push(&cmd.args, "--fix-thin"); if (args->lock_pack || unpack_limit) { char hostname[HOST_NAME_MAX + 1]; - if (gethostname(hostname, sizeof(hostname))) + if (xgethostname(hostname, sizeof(hostname))) xsnprintf(hostname, sizeof(hostname), "localhost"); argv_array_pushf(&cmd.args, "--keep=fetch-pack %"PRIuMAX " on %s", diff --git a/git-compat-util.h b/git-compat-util.h index 46f3abe401..bd04564a69 100644 --- a/git-compat-util.h +++ b/git-compat-util.h @@ -888,6 +888,8 @@ extern int xsnprintf(char *dst, size_t max, const char *fmt, ...); #define HOST_NAME_MAX 256 #endif +extern int xgethostname(char *buf, size_t len); + /* in ctype.c, for kwset users */ extern const unsigned char tolower_trans_tbl[256]; diff --git a/ident.c b/ident.c index 556851cf94..bea871c8e0 100644 --- a/ident.c +++ b/ident.c @@ -122,7 +122,7 @@ static void add_domainname(struct strbuf *out, int *is_bogus) { char buf[HOST_NAME_MAX + 1]; - if (gethostname(buf, sizeof(buf))) { + if (xgethostname(buf, sizeof(buf))) { warning_errno("cannot get host name"); strbuf_addstr(out, "(none)"); *is_bogus = 1; diff --git a/wrapper.c b/wrapper.c index 0542fc7582..d837417709 100644 --- a/wrapper.c +++ b/wrapper.c @@ -655,3 +655,16 @@ void sleep_millisec(int millisec) { poll(NULL, 0, millisec); } + +int xgethostname(char *buf, size_t len) +{ + /* + * If the full hostname doesn't fit in buf, POSIX does not + * specify whether the buffer will be null-terminated, so to + * be safe, do it ourselves. + */ + int ret = gethostname(buf, len); + if (!ret) + buf[len - 1] = 0; + return ret; +} -- 2.11.GIT