Module Name: src Committed By: snj Date: Tue Mar 22 09:04:20 UTC 2016
Modified Files: src/lib/librt [netbsd-7]: shm.c Log Message: Pull up following revision(s) (requested by martin in ticket #1144): lib/librt/shm.c: revisions 1.2, 1.3 Allow /var/shm to be a symlink to a properly set up directory. -- Simplify previous by just doing an open() on the directory and then using the fstat* family to test for all relevant details. Clean up buffer sizes and clarify a length check. Based on input from dholland. To generate a diff of this commit: cvs rdiff -u -r1.1 -r1.1.6.1 src/lib/librt/shm.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/lib/librt/shm.c diff -u src/lib/librt/shm.c:1.1 src/lib/librt/shm.c:1.1.6.1 --- src/lib/librt/shm.c:1.1 Thu Dec 19 19:11:50 2013 +++ src/lib/librt/shm.c Tue Mar 22 09:04:19 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: shm.c,v 1.1 2013/12/19 19:11:50 rmind Exp $ */ +/* $NetBSD: shm.c,v 1.1.6.1 2016/03/22 09:04:19 snj Exp $ */ /*- * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: shm.c,v 1.1 2013/12/19 19:11:50 rmind Exp $"); +__RCSID("$NetBSD: shm.c,v 1.1.6.1 2016/03/22 09:04:19 snj Exp $"); #include <sys/mman.h> #include <sys/mount.h> @@ -57,31 +57,36 @@ __RCSID("$NetBSD: shm.c,v 1.1 2013/12/19 #define MOUNT_SHMFS MOUNT_TMPFS -static const char * _shmfs_path = NULL; +static bool shm_ok = false; static bool _shm_check_fs(void) { - const char *shmfs = SHMFS_DIR_PATH; + int fd; struct statvfs sv; struct stat st; - if (statvfs1(shmfs, &sv, ST_NOWAIT) == -1) { + fd = open(SHMFS_DIR_PATH, O_DIRECTORY|O_RDONLY); + if (fd == -1) return false; - } - if (strncmp(sv.f_fstypename, MOUNT_SHMFS, sizeof(sv.f_fstypename))) { - return false; - } - if (lstat(shmfs, &st) == -1) { - return false; - } - if ((st.st_mode & SHMFS_DIR_MODE) != SHMFS_DIR_MODE) { - return false; - } + if (fstatvfs1(fd, &sv, ST_NOWAIT) == -1) + goto out; + + if (strncmp(sv.f_fstypename, MOUNT_SHMFS, sizeof(sv.f_fstypename))) + goto out; + + if (fstat(fd, &st) == -1) + goto out; + + if ((st.st_mode & SHMFS_DIR_MODE) != SHMFS_DIR_MODE) + goto out; + + shm_ok = true; - _shmfs_path = shmfs; - return true; +out: + close(fd); + return shm_ok; } static bool @@ -89,7 +94,7 @@ _shm_get_path(char *buf, size_t len, con { int ret; - if (__predict_false(!_shmfs_path) && !_shm_check_fs()) { + if (__predict_false(!shm_ok) && !_shm_check_fs()) { errno = ENOTSUP; return false; } @@ -103,10 +108,10 @@ _shm_get_path(char *buf, size_t len, con return false; } - ret = snprintf(buf, len, "%s/%s%s", - _shmfs_path, SHMFS_OBJ_PREFIX, name); + ret = snprintf(buf, len, SHMFS_DIR_PATH "/" SHMFS_OBJ_PREFIX "%s", + name); - if ((size_t)ret >= PATH_MAX) { + if ((size_t)ret >= len) { errno = ENAMETOOLONG; return false; } @@ -116,7 +121,7 @@ _shm_get_path(char *buf, size_t len, con int shm_open(const char *name, int oflag, mode_t mode) { - char path[PATH_MAX + 1]; + char path[PATH_MAX]; if (!_shm_get_path(path, sizeof(path), name)) { return -1; @@ -127,7 +132,7 @@ shm_open(const char *name, int oflag, mo int shm_unlink(const char *name) { - char path[PATH_MAX + 1]; + char path[PATH_MAX]; if (!_shm_get_path(path, sizeof(path), name)) { return -1;