git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: What's cooking in git.git (Apr 2017, #02; Sun, 16)

From
René Scharfe <l.s.r@web.de>
Date
Apr 17, 2017, 09:56 UTC
Message-ID
<e6f869b1-09c2-88eb-d79d-b0dc2090a632@web.de>
In-Reply-To
<xmqqmvbfij92.fsf@gitster.mtv.corp.google.com>
Am 17.04.2017 um 09:30 schrieb Junio C Hamano:
Show 9 quoted lines
> * dt/xgethostname-nul-termination (2017-04-13) 1 commit
>   - xgethostname: handle long hostnames
> 
>   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.
> 
>   Will merge to 'next'.
[Sorry for repeating, but I didn't see a direct reply.]

If a host name doesn't fit then the buffer is too small. Let's make it big enough, reducing the number of magic constants and avoiding silent truncation all at the same time. Patch for that:

-- >8 --
Subject: [PATCH] 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@twopensource.com> 
Signed-off-by: Rene Scharfe <l.s.r@web.de>
---
 builtin/gc.c           | 2 +-
 builtin/receive-pack.c | 2 +-
 daemon.c               | 4 ----
 fetch-pack.c           | 2 +-
 git-compat-util.h      | 4 ++++
 ident.c                | 2 +-
 6 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/builtin/gc.c b/builtin/gc.c
index 2daede7820..1fca84c19d 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;
diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c
index 7020278081..dbbc7d03dc 100644
--- a/builtin/receive-pack.c
+++ b/builtin/receive-pack.c
@@ -1698,7 +1698,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", NULL);
 		push_header_arg(&child.args, &hdr);
diff --git a/daemon.c b/daemon.c
index f70d27b826..ac7181a483 100644
--- 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
diff --git a/fetch-pack.c b/fetch-pack.c
index d07d85ce30..055f568775 100644
--- a/fetch-pack.c
+++ b/fetch-pack.c
@@ -802,7 +802,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,
diff --git a/git-compat-util.h b/git-compat-util.h
index 8a4a3f85e7..46f3abe401 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h
@@ -884,6 +884,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 c0364fe3a1..556851cf94 100644
--- 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");
-- 
2.12.2
Previous: Junio C HamanoNext: Jonathan Nieder
Message 2 of 4 in “What's cooking in git.git (Apr 2017, #02; Sun, 16)”
  1. Junio C HamanoApr 17, 2017
  2. René ScharfeApr 17, 2017
  3. Jonathan NiederApr 17, 2017
  4. Junio C HamanoApr 18, 2017

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.