diff options
author | Jim Meyering <jim@meyering.net> | 2000-07-08 21:48:07 +0000 |
---|---|---|
committer | Jim Meyering <jim@meyering.net> | 2000-07-08 21:48:07 +0000 |
commit | 3f94561e84d2b74a4003036dfec46b8c82d56798 (patch) | |
tree | 3aa2853857d388b31bce04d933563e3b0ff73dd8 /lib | |
parent | c85595bddfde2edcf864877aac77d1e14e684dd6 (diff) | |
download | coreutils-3f94561e84d2b74a4003036dfec46b8c82d56798.tar.xz |
(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.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/xgethostname.c | 22 |
1 files changed, 12 insertions, 10 deletions
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; |