summaryrefslogtreecommitdiff
path: root/lib/xgethostname.c
diff options
context:
space:
mode:
authorJim Meyering <jim@meyering.net>2000-07-08 21:48:07 +0000
committerJim Meyering <jim@meyering.net>2000-07-08 21:48:07 +0000
commit3f94561e84d2b74a4003036dfec46b8c82d56798 (patch)
tree3aa2853857d388b31bce04d933563e3b0ff73dd8 /lib/xgethostname.c
parentc85595bddfde2edcf864877aac77d1e14e684dd6 (diff)
downloadcoreutils-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/xgethostname.c')
-rw-r--r--lib/xgethostname.c22
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;