Mercurial > hg > octave-kai > gnulib-hg
changeset 2717:8ba490f08aea
(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.
author | Jim Meyering <jim@meyering.net> |
---|---|
date | Sat, 08 Jul 2000 21:48:07 +0000 |
parents | 404958bcbb55 |
children | 5994c6f939c5 |
files | lib/xgethostname.c |
diffstat | 1 files changed, 12 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- 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 @@ 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;