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;