diff options
author | Peter Rajnoha <prajnoha@redhat.com> | 2013-01-15 14:59:54 +0100 |
---|---|---|
committer | Peter Rajnoha <prajnoha@redhat.com> | 2013-01-15 14:59:54 +0100 |
commit | 6fc596ca90640817fd555942bd5b5d3b7404a177 (patch) | |
tree | 70816a04c4f022978d61d4ef3ceb2e17e3500ddc /daemons | |
parent | 2b760a7fa7de3b1e3d2db182e5c6fb472b4fe9a1 (diff) | |
download | lvm2-6fc596ca90640817fd555942bd5b5d3b7404a177.tar.gz |
dmeventd: close dmeventd FIFO FDs on exec (add FD_CLOEXEC).
Diffstat (limited to 'daemons')
-rw-r--r-- | daemons/dmeventd/dmeventd.c | 37 |
1 files changed, 28 insertions, 9 deletions
diff --git a/daemons/dmeventd/dmeventd.c b/daemons/dmeventd/dmeventd.c index 13148c3a2..5f2339f80 100644 --- a/daemons/dmeventd/dmeventd.c +++ b/daemons/dmeventd/dmeventd.c @@ -1237,7 +1237,8 @@ static int _get_timeout(struct message_data *message_data) /* Initialize a fifos structure with path names. */ static void _init_fifos(struct dm_event_fifos *fifos) { - memset(fifos, 0, sizeof(*fifos)); + fifos->client = -1; + fifos->server = -1; fifos->client_path = DM_EVENT_FIFO_CLIENT; fifos->server_path = DM_EVENT_FIFO_SERVER; @@ -1254,7 +1255,7 @@ static int _open_fifos(struct dm_event_fifos *fifos) syslog(LOG_ERR, "%s: Failed to create client fifo %s: %m.\n", __func__, fifos->client_path); (void) dm_prepare_selinux_context(NULL, 0); - return 0; + goto fail; } /* Create server fifo. */ @@ -1263,7 +1264,7 @@ static int _open_fifos(struct dm_event_fifos *fifos) syslog(LOG_ERR, "%s: Failed to create server fifo %s: %m.\n", __func__, fifos->server_path); (void) dm_prepare_selinux_context(NULL, 0); - return 0; + goto fail; } (void) dm_prepare_selinux_context(NULL, 0); @@ -1281,31 +1282,49 @@ static int _open_fifos(struct dm_event_fifos *fifos) if (chmod(fifos->client_path, 0600)) { syslog(LOG_ERR, "Unable to set correct file permissions on %s: %m.\n", fifos->client_path); - return 0; + goto fail; } if (chmod(fifos->server_path, 0600)) { syslog(LOG_ERR, "Unable to set correct file permissions on %s: %m.\n", fifos->server_path); - return 0; + goto fail; } /* Need to open read+write or we will block or fail */ if ((fifos->server = open(fifos->server_path, O_RDWR)) < 0) { syslog(LOG_ERR, "Failed to open fifo server %s: %m.\n", fifos->server_path); - return 0; + goto fail; + } + + if (fcntl(fifos->server, F_SETFD, FD_CLOEXEC) < 0) { + syslog(LOG_ERR, "Failed to set FD_CLOEXEC for fifo server %s: %m.\n", + fifos->server_path); + goto fail; } /* Need to open read+write for select() to work. */ if ((fifos->client = open(fifos->client_path, O_RDWR)) < 0) { syslog(LOG_ERR, "Failed to open fifo client %s: %m", fifos->client_path); - if (close(fifos->server)) - syslog(LOG_ERR, "Failed to close fifo server %s: %m", fifos->server_path); - return 0; + goto fail; + } + + if (fcntl(fifos->client, F_SETFD, FD_CLOEXEC) < 0) { + syslog(LOG_ERR, "Failed to set FD_CLOEXEC for fifo client %s: %m.\n", + fifos->client_path); + goto fail; } return 1; +fail: + if (fifos->server >= 0 && close(fifos->server)) + syslog(LOG_ERR, "Failed to close fifo server %s: %m", fifos->server_path); + + if (fifos->client >= 0 && close(fifos->client)) + syslog(LOG_ERR, "Failed to close fifo client %s: %m", fifos->client_path); + + return 0; } /* |