]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
make sure we set close on exec on any possibly inherited fds
authorAndrew Tridgell <tridge@samba.org>
Wed, 19 Sep 2007 01:46:37 +0000 (11:46 +1000)
committerAndrew Tridgell <tridge@samba.org>
Wed, 19 Sep 2007 01:46:37 +0000 (11:46 +1000)
(This used to be ctdb commit d9dec82076f14a348e7b67b4350180681ff86f32)

ctdb/lib/events/events_epoll.c
ctdb/lib/tdb/common/open.c
ctdb/server/ctdb_recover.c

index 5e1c1417c86e07a6a6d00114636851fae086138c..d10eb79ea78813ce0b43a721a948d7f2d309c818 100644 (file)
@@ -90,7 +90,14 @@ static int epoll_ctx_destructor(struct epoll_event_context *epoll_ev)
 */
 static void epoll_init_ctx(struct epoll_event_context *epoll_ev)
 {
+       unsigned v;
+
        epoll_ev->epoll_fd = epoll_create(64);
+
+       /* on exec, don't inherit the fd */
+       v = fcntl(epoll_ev->epoll_fd, F_GETFD, 0);
+        fcntl(epoll_ev->epoll_fd, F_SETFD, v | FD_CLOEXEC);
+
        epoll_ev->pid = getpid();
        talloc_set_destructor(epoll_ev, epoll_ctx_destructor);
 }
@@ -105,6 +112,7 @@ static void epoll_add_event(struct epoll_event_context *epoll_ev, struct fd_even
 static void epoll_check_reopen(struct epoll_event_context *epoll_ev)
 {
        struct fd_event *fde;
+       unsigned v;
 
        if (epoll_ev->pid == getpid()) {
                return;
@@ -116,6 +124,11 @@ static void epoll_check_reopen(struct epoll_event_context *epoll_ev)
                DEBUG(0,("Failed to recreate epoll handle after fork\n"));
                return;
        }
+
+       /* on exec, don't inherit the fd */
+       v = fcntl(epoll_ev->epoll_fd, F_GETFD, 0);
+        fcntl(epoll_ev->epoll_fd, F_SETFD, v | FD_CLOEXEC);
+
        epoll_ev->pid = getpid();
        for (fde=epoll_ev->fd_events;fde;fde=fde->next) {
                epoll_add_event(epoll_ev, fde);
index 1985bb75f34efdf35121c976ae5f9752c74e2df2..8ff2f1056428d2e018c41a85f0f7384f525e2a60 100644 (file)
@@ -138,6 +138,7 @@ struct tdb_context *tdb_open_ex(const char *name, int hash_size, int tdb_flags,
        int rev = 0, locked = 0;
        unsigned char *vp;
        u32 vertest;
+       unsigned v;
 
        if (!(tdb = (struct tdb_context *)calloc(1, sizeof *tdb))) {
                /* Can't log this */
@@ -197,6 +198,10 @@ struct tdb_context *tdb_open_ex(const char *name, int hash_size, int tdb_flags,
                goto fail;      /* errno set by open(2) */
        }
 
+       /* on exec, don't inherit the fd */
+       v = fcntl(tdb->fd, F_GETFD, 0);
+        fcntl(tdb->fd, F_SETFD, v | FD_CLOEXEC);
+
        /* ensure there is only one process initialising at once */
        if (tdb->methods->tdb_brlock(tdb, GLOBAL_LOCK, F_WRLCK, F_SETLKW, 0, 1) == -1) {
                TDB_LOG((tdb, TDB_DEBUG_ERROR, "tdb_open_ex: failed to get global lock on %s: %s\n",
index a07f5235026b3440e8aa64da7d51fe6764f46f42..c79c85d4e7d5c8c003df856eab0a65d559fbf5a8 100644 (file)
@@ -661,6 +661,8 @@ bool ctdb_recovery_lock(struct ctdb_context *ctdb, bool keep)
                return false;
        }
 
+       set_close_on_exec(ctdb->recovery_lock_fd);
+
        lock.l_type = F_WRLCK;
        lock.l_whence = SEEK_SET;
        lock.l_start = 0;