From: Jim Meyering Date: Sat, 8 Jul 2000 21:48:07 +0000 (+0000) Subject: (xgethostname): Protect against the SunOS5.5 bug X-Git-Tag: FILEUTILS-4_0x~101 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3f94561e84d2b74a4003036dfec46b8c82d56798;p=platform%2Fupstream%2Fcoreutils.git (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. --- diff --git a/lib/xgethostname.c b/lib/xgethostname.c index 1139a1b..e24124c 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;