diff options
Diffstat (limited to 'nss/nss_db')
-rw-r--r-- | nss/nss_db/db-XXX.c | 24 | ||||
-rw-r--r-- | nss/nss_db/db-alias.c | 22 | ||||
-rw-r--r-- | nss/nss_db/db-netgrp.c | 20 |
3 files changed, 63 insertions, 3 deletions
diff --git a/nss/nss_db/db-XXX.c b/nss/nss_db/db-XXX.c index 0c1b1ada37..54e7a754c3 100644 --- a/nss/nss_db/db-XXX.c +++ b/nss/nss_db/db-XXX.c @@ -1,5 +1,5 @@ /* Common code for DB-based databases in nss_db 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. The GNU C Library is free software; you can redistribute it and/or @@ -66,7 +66,27 @@ internal_setent (int stayopen) db = __dbopen (DBFILE, O_RDONLY, 0, DB_BTREE, NULL); if (db == NULL) - status = NSS_STATUS_UNAVAIL; + status = errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL; + else + { + /* We have to make sure the file is `closed on exec'. */ + int result, flags; + + result = flags = fcntl ((*db->fd) (db), F_GETFD, 0); + if (result >= 0) + { + flags |= FD_CLOEXEC; + result = fcntl ((*db->fd) (db), F_SETFD, flags); + } + if (result < 0) + { + /* Something went wrong. Close the stream and return a + failure. */ + (*db->close) (db); + db = NULL; + status = NSS_STATUS_UNAVAIL; + } + } } /* Remember STAYOPEN flag. */ diff --git a/nss/nss_db/db-alias.c b/nss/nss_db/db-alias.c index 8b8cb41238..810fc3aba6 100644 --- a/nss/nss_db/db-alias.c +++ b/nss/nss_db/db-alias.c @@ -1,5 +1,5 @@ /* Mail alias file parser in nss_db 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. @@ -51,6 +51,26 @@ internal_setent (int stayopen) if (db == NULL) status = NSS_STATUS_UNAVAIL; + else + { + /* We have to make sure the file is `closed on exec'. */ + int result, flags; + + result = flags = fcntl ((*db->fd) (db), F_GETFD, 0); + if (result >= 0) + { + flags |= FD_CLOEXEC; + result = fcntl ((*db->fd) (db), F_SETFD, flags); + } + if (result < 0) + { + /* Something went wrong. Close the stream and return a + failure. */ + (*db->close) (db); + db = NULL; + status = NSS_STATUS_UNAVAIL; + } + } } /* Remember STAYOPEN flag. */ diff --git a/nss/nss_db/db-netgrp.c b/nss/nss_db/db-netgrp.c index e716dd00b2..c301789f74 100644 --- a/nss/nss_db/db-netgrp.c +++ b/nss/nss_db/db-netgrp.c @@ -53,6 +53,26 @@ _nss_db_setnetgrent (const char *group) if (db == NULL) status = errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL; + else + { + /* We have to make sure the file is `closed on exec'. */ + int result, flags; + + result = flags = fcntl ((*db->fd) (db), F_GETFD, 0); + if (result >= 0) + { + flags |= FD_CLOEXEC; + result = fcntl ((*db->fd) (db), F_SETFD, flags); + } + if (result < 0) + { + /* Something went wrong. Close the stream and return a + failure. */ + (*db->close) (db); + db = NULL; + status = NSS_STATUS_UNAVAIL; + } + } } if (status == NSS_STATUS_SUCCESS) |