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;

Reply via email to