From 3f94561e84d2b74a4003036dfec46b8c82d56798 Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Sat, 8 Jul 2000 21:48:07 +0000 Subject: (xgethostname): Protect against the SunOS5.5 bug by allocating a larger buffer. Test the gethostname return value for being >= 0, not == 0, for BeOS. Don't exhaust memory if gethostname returns an error and ENAMETOOLONG isn't defined. --- lib/xgethostname.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) (limited to 'lib/xgethostname.c') diff --git a/lib/xgethostname.c b/lib/xgethostname.c index 1139a1b19..e24124c57 100644 --- a/lib/xgethostname.c +++ b/lib/xgethostname.c @@ -1,5 +1,5 @@ /* xgethostname.c -- return current hostname with unlimited length - Copyright (C) 1992, 1996 Free Software Foundation, Inc. + Copyright (C) 1992, 1996, 2000 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -50,25 +50,27 @@ xgethostname () int err; size = INITIAL_HOSTNAME_LENGTH; - hostname = xmalloc (size); + /* Use size + 1 here rather than size to work around the bug + in SunOS5.5's gethostname whereby it NUL-terminates HOSTNAME + even when the name is longer than the supplied buffer. */ + hostname = xmalloc (size + 1); while (1) { - /* Use size - 2 here rather than size - 1 to work around the bug - in SunOS5.5's gethostname whereby it NUL-terminates HOSTNAME - even when the name is longer than the supplied buffer. */ - int k = size - 2; + int k = size - 1; errno = 0; hostname[k] = '\0'; err = gethostname (hostname, size); - if (err == 0 && hostname[k] == '\0') + if (err >= 0 && hostname[k] == '\0') break; #ifdef ENAMETOOLONG - else if (err != 0 && errno != ENAMETOOLONG && errno != 0) - error (EXIT_FAILURE, errno, "gethostname"); + else if (err < 0 && errno != ENAMETOOLONG && errno != 0) +#else + else if (err < 0 && errno != 0) #endif + error (EXIT_FAILURE, errno, "gethostname"); size *= 2; - hostname = xrealloc (hostname, size); + hostname = xrealloc (hostname, size + 1); } return hostname; -- cgit v1.2.3-54-g00ecf