summaryrefslogtreecommitdiffstats
path: root/sys/fs/pseudofs/pseudofs.h
diff options
context:
space:
mode:
authordes <des@FreeBSD.org>2001-10-01 04:22:20 +0000
committerdes <des@FreeBSD.org>2001-10-01 04:22:20 +0000
commite1b05f5687fbe0556cfab55517800169bc5da426 (patch)
tree62268de8821a9da6754d96e01ebfdc5653ef7674 /sys/fs/pseudofs/pseudofs.h
parentd6dca2e412b6f853bdfed2ddcf74bd5d060e8d67 (diff)
downloadFreeBSD-src-e1b05f5687fbe0556cfab55517800169bc5da426.zip
FreeBSD-src-e1b05f5687fbe0556cfab55517800169bc5da426.tar.gz
YA pseudofs megacommit, part 1:
- Add a third callback to the pfs_node structure. This one simply returns non-zero if the specified requesting process is allowed to access the specified node for the specified target process. This is used in addition to the usual permission checks, e.g. when certain files don't make sense for certain (system) processes. - Make sure that pfs_lookup() and pfs_readdir() don't yap about files which aren't pfs_visible(). Also check pfs_visible() before performing reads and writes, to prevent the kind of races reported in SA-00:77 and SA-01:55 (fork a child, open /proc/child/ctl, have that child fork a setuid binary, and assume control of it). - Add some more trace points.
Diffstat (limited to 'sys/fs/pseudofs/pseudofs.h')
-rw-r--r--sys/fs/pseudofs/pseudofs.h38
1 files changed, 24 insertions, 14 deletions
diff --git a/sys/fs/pseudofs/pseudofs.h b/sys/fs/pseudofs/pseudofs.h
index 8bff258..e925d92 100644
--- a/sys/fs/pseudofs/pseudofs.h
+++ b/sys/fs/pseudofs/pseudofs.h
@@ -89,6 +89,15 @@ typedef int (*pfs_attr_t)(PFS_ATTR_ARGS);
struct pfs_bitmap; /* opaque */
/*
+ * Visibility callback
+ */
+#define PFS_VIS_ARGS \
+ struct thread *td, struct proc *p, struct pfs_node *pn
+#define PFS_VIS_PROTO(name) \
+ int name(PFS_VIS_ARGS);
+typedef int (*pfs_vis_t)(PFS_VIS_ARGS);
+
+/*
* pfs_info: describes a pseudofs instance
*/
struct pfs_info {
@@ -114,6 +123,7 @@ struct pfs_node {
#define pn_func u1._pn_func
#define pn_nodes u1._pn_nodes
pfs_attr_t pn_attr;
+ pfs_vis_t pn_vis;
void *pn_data;
int pn_flags;
/* members below this line aren't initialized */
@@ -121,24 +131,24 @@ struct pfs_node {
u_int32_t pn_fileno;
};
-#define PFS_NODE(name, type, fill, attr, data, flags) \
- { (name), (type), { (fill) }, (attr), (data), (flags) }
-#define PFS_DIR(name, nodes, attr, data, flags) \
- PFS_NODE(name, pfstype_dir, nodes, attr, data, flags)
+#define PFS_NODE(name, type, fill, attr, vis, data, flags) \
+ { (name), (type), { (fill) }, (attr), (vis), (data), (flags) }
+#define PFS_DIR(name, nodes, attr, vis, data, flags) \
+ PFS_NODE(name, pfstype_dir, nodes, attr, vis, data, flags)
#define PFS_ROOT(nodes) \
- PFS_NODE("/", pfstype_root, nodes, NULL, NULL, 0)
+ PFS_NODE("/", pfstype_root, nodes, NULL, NULL, NULL, 0)
#define PFS_THIS \
- PFS_NODE(".", pfstype_this, NULL, NULL, NULL, 0)
+ PFS_NODE(".", pfstype_this, NULL, NULL, NULL, NULL, 0)
#define PFS_PARENT \
- PFS_NODE("..", pfstype_parent, NULL, NULL, NULL, 0)
-#define PFS_FILE(name, func, attr, data, flags) \
- PFS_NODE(name, pfstype_file, func, attr, data, flags)
-#define PFS_SYMLINK(name, func, attr, data, flags) \
- PFS_NODE(name, pfstype_symlink, func, attr, data, flags)
-#define PFS_PROCDIR(nodes, attr, data, flags) \
- PFS_NODE("", pfstype_procdir, nodes, attr, data, flags)
+ PFS_NODE("..", pfstype_parent, NULL, NULL, NULL, NULL, 0)
+#define PFS_FILE(name, func, attr, vis, data, flags) \
+ PFS_NODE(name, pfstype_file, func, attr, vis, data, flags)
+#define PFS_SYMLINK(name, func, attr, vis, data, flags) \
+ PFS_NODE(name, pfstype_symlink, func, attr, vis, data, flags)
+#define PFS_PROCDIR(nodes, attr, vis, data, flags) \
+ PFS_NODE("", pfstype_procdir, nodes, attr, vis, data, flags)
#define PFS_LASTNODE \
- PFS_NODE("", pfstype_none, NULL, NULL, NULL, 0)
+ PFS_NODE("", pfstype_none, NULL, NULL, NULL, NULL, 0)
/*
* VFS interface
OpenPOWER on IntegriCloud