diff options
Diffstat (limited to 'nss/nss_files')
-rw-r--r-- | nss/nss_files/files-XXX.c | 21 | ||||
-rw-r--r-- | nss/nss_files/files-alias.c | 23 | ||||
-rw-r--r-- | nss/nss_files/files-hosts.c | 20 |
3 files changed, 55 insertions, 9 deletions
diff --git a/nss/nss_files/files-XXX.c b/nss/nss_files/files-XXX.c index 3281580b8f..e80c06d269 100644 --- a/nss/nss_files/files-XXX.c +++ b/nss/nss_files/files-XXX.c @@ -21,6 +21,7 @@ #include <ctype.h> #include <assert.h> #include <errno.h> +#include <fcntl.h> #include <bits/libc-lock.h> #include "nsswitch.h" @@ -72,6 +73,26 @@ internal_setent (int stayopen) if (stream == NULL) status = NSS_STATUS_UNAVAIL; + else + { + /* We have to make sure the file is `closed on exec'. */ + int result, flags; + + result = flags = fcntl (fileno (stream), F_GETFD, 0); + if (result >= 0) + { + flags |= FD_CLOEXEC; + result = fcntl (fileno (stream), F_SETFD, flags); + } + if (result < 0) + { + /* Something went wrong. Close the stream and return a + failure. */ + fclose (stream); + stream = NULL; + status = NSS_STATUS_UNAVAIL; + } + } } else rewind (stream); diff --git a/nss/nss_files/files-alias.c b/nss/nss_files/files-alias.c index 99217fa7c5..0a910aa0fe 100644 --- a/nss/nss_files/files-alias.c +++ b/nss/nss_files/files-alias.c @@ -1,5 +1,5 @@ /* Mail alias file parser in nss_files module. - Copyright (C) 1996 Free Software Foundation, Inc. + Copyright (C) 1996, 1997 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. @@ -21,6 +21,7 @@ #include <aliases.h> #include <ctype.h> #include <errno.h> +#include <fcntl.h> #include <bits/libc-lock.h> #include <stdlib.h> #include <stdio.h> @@ -49,6 +50,26 @@ internal_setent (void) if (stream == NULL) status = NSS_STATUS_UNAVAIL; + else + { + /* We have to make sure the file is `closed on exec'. */ + int result, flags; + + result = flags = fcntl (fileno (stream), F_GETFD, 0); + if (result >= 0) + { + flags |= FD_CLOEXEC; + result = fcntl (fileno (stream), F_SETFD, flags); + } + if (result < 0) + { + /* Something went wrong. Close the stream and return a + failure. */ + fclose (stream); + stream = NULL; + status = NSS_STATUS_UNAVAIL; + } + } } else rewind (stream); diff --git a/nss/nss_files/files-hosts.c b/nss/nss_files/files-hosts.c index 239dea7ebd..d6c4152507 100644 --- a/nss/nss_files/files-hosts.c +++ b/nss/nss_files/files-hosts.c @@ -50,12 +50,7 @@ LINE_PARSER STRING_FIELD (addr, isspace, 1); /* Parse address. */ - if (inet_pton (AF_INET6, p, entdata->host_addr) > 0) - { - result->h_addrtype = AF_INET6; - result->h_length = IN6ADDRSZ; - } - else if (inet_pton (AF_INET, addr, entdata->host_addr) > 0) + if (inet_pton (AF_INET, addr, entdata->host_addr) > 0) { if (_res.options & RES_USE_INET6) { @@ -70,6 +65,11 @@ LINE_PARSER result->h_length = INADDRSZ; } } + else if (inet_pton (AF_INET6, addr, entdata->host_addr) > 0) + { + result->h_addrtype = AF_INET6; + result->h_length = IN6ADDRSZ; + } else /* Illegal address: ignore line. */ return 0; @@ -85,8 +85,12 @@ LINE_PARSER #include "files-XXX.c" DB_LOOKUP (hostbyname, ,, - LOOKUP_NAME (h_name, h_aliases), - const char *name) + { + if (result->h_addrtype != ((_res.options & RES_USE_INET6) + ? AF_INET6 : AF_INET)) + continue; + LOOKUP_NAME (h_name, h_aliases) + }, const char *name) DB_LOOKUP (hostbyname2, ,, { |