X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fshm.c;h=a6328d5f618fb4474d70b5d5966cf45d5ff4a121;hp=432d07ecea5eb4462d36a6a4727737532e97791f;hb=87597c2c3bbaa1502ad2025cbf16704829f3b464;hpb=ca2eb7f43cf00d12f563905d741a6789c3d130ee diff --git a/src/bin/lttng-sessiond/shm.c b/src/bin/lttng-sessiond/shm.c index 432d07ece..a6328d5f6 100644 --- a/src/bin/lttng-sessiond/shm.c +++ b/src/bin/lttng-sessiond/shm.c @@ -2,21 +2,21 @@ * Copyright (C) 2011 - David Goulet * Mathieu Desnoyers * - * 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 the Free - * Software Foundation; only version 2 of the License. + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License, version 2 only, + * as published by the Free Software Foundation. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., 59 Temple - * Place - Suite 330, Boston, MA 02111-1307, USA. + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#define _GNU_SOURCE +#define _LGPL_SOURCE #include #include #include @@ -43,43 +43,22 @@ static int get_wait_shm(char *shm_path, size_t mmap_size, int global) int wait_shm_fd, ret; mode_t mode; + assert(shm_path); + /* Default permissions */ mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP; - /* Change owner of the shm path */ + /* + * Change owner of the shm path. + */ if (global) { - ret = chown(shm_path, 0, 0); - if (ret < 0) { - if (errno != ENOENT) { - PERROR("chown wait shm"); - goto error; - } - } - /* - * If global session daemon, any application can register so the shm - * needs to be set in read-only mode for others. + * If global session daemon, any application can + * register. Make it initially writeable so applications + * registering concurrently can do ftruncate() by + * themselves. */ - mode |= S_IROTH; - } else { - ret = chown(shm_path, getuid(), getgid()); - if (ret < 0) { - if (errno != ENOENT) { - PERROR("chown wait shm"); - goto error; - } - } - } - - /* - * Set permissions to the shm even if we did not create the shm. - */ - ret = chmod(shm_path, mode); - if (ret < 0) { - if (errno != ENOENT) { - PERROR("chmod wait shm"); - goto error; - } + mode |= S_IROTH | S_IWOTH; } /* @@ -105,13 +84,32 @@ static int get_wait_shm(char *shm_path, size_t mmap_size, int global) } #ifndef __FreeBSD__ - ret = fchmod(wait_shm_fd, mode); - if (ret < 0) { - PERROR("fchmod"); - exit(EXIT_FAILURE); + if (global) { + ret = fchown(wait_shm_fd, 0, 0); + if (ret < 0) { + PERROR("fchown"); + exit(EXIT_FAILURE); + } + /* + * If global session daemon, any application can + * register so the shm needs to be set in read-only mode + * for others. + */ + mode &= ~S_IWOTH; + ret = fchmod(wait_shm_fd, mode); + if (ret < 0) { + PERROR("fchmod"); + exit(EXIT_FAILURE); + } + } else { + ret = fchown(wait_shm_fd, getuid(), getgid()); + if (ret < 0) { + PERROR("fchown"); + exit(EXIT_FAILURE); + } } #else -#warning "FreeBSD does not support setting file mode on shm FD. Remember that for secure use, lttng-sessiond should be started before applications linked on lttng-ust." +#warning "FreeBSD does not support setting file mode on shm FD." #endif DBG("Got the wait shm fd %d", wait_shm_fd); @@ -134,9 +132,19 @@ error: */ char *shm_ust_get_mmap(char *shm_path, int global) { - size_t mmap_size = sysconf(_SC_PAGE_SIZE); + size_t mmap_size; int wait_shm_fd, ret; char *wait_shm_mmap; + long sys_page_size; + + assert(shm_path); + + sys_page_size = sysconf(_SC_PAGE_SIZE); + if (sys_page_size < 0) { + PERROR("sysconf PAGE_SIZE"); + goto error; + } + mmap_size = sys_page_size; wait_shm_fd = get_wait_shm(shm_path, mmap_size, global); if (wait_shm_fd < 0) {