* All Rights Reserved.
*/
/*
- * posix_shm.c : Support for POSIX semaphore APIs
+ * posix_sem.c : Support for POSIX semaphore APIs
*
* File: posix_sem.c
* Author: Ananthakrishna Ramesh
#define f_flag f_fglob->fg_flag
-#define f_type f_fglob->fg_type
+#define f_type f_fglob->fg_ops->fo_type
#define f_msgcount f_fglob->fg_msgcount
#define f_cred f_fglob->fg_cred
#define f_ops f_fglob->fg_ops
gid_t psem_gid;
char psem_name[PSEMNAMLEN + 1]; /* segment name */
semaphore_t psem_semobject;
- proc_t sem_proc;
struct label * psem_label;
+ pid_t psem_creator_pid;
+ uint64_t psem_creator_uniqueid;
};
#define PSEMINFO_NULL (struct pseminfo *)0
long psemnument; /* number of cache entries allocated */
long posix_sem_max = 10000; /* tunable for max POSIX semaphores */
/* 10000 limits to ~1M of memory */
-SYSCTL_NODE(_kern, KERN_POSIX, posix, CTLFLAG_RW|CTLFLAG_LOCKED, 0, "Posix");
-SYSCTL_NODE(_kern_posix, OID_AUTO, sem, CTLFLAG_RW|CTLFLAG_LOCKED, 0, "Semaphores");
-SYSCTL_LONG (_kern_posix_sem, OID_AUTO, max, CTLFLAG_RW, &posix_sem_max, "max");
+SYSCTL_NODE(_kern, KERN_POSIX, posix, CTLFLAG_RW | CTLFLAG_LOCKED, 0, "Posix");
+SYSCTL_NODE(_kern_posix, OID_AUTO, sem, CTLFLAG_RW | CTLFLAG_LOCKED, 0, "Semaphores");
+SYSCTL_LONG (_kern_posix_sem, OID_AUTO, max, CTLFLAG_RW | CTLFLAG_LOCKED, &posix_sem_max, "max");
struct psemstats psemstats; /* cache effectiveness statistics */
static int psem_kqfilter (struct fileproc *fp, struct knote *kn, vfs_context_t ctx);
-struct fileops psemops =
- { psem_read, psem_write, psem_ioctl, psem_select, psem_closefile, psem_kqfilter, NULL };
-
+static const struct fileops psemops = {
+ DTYPE_PSXSEM,
+ psem_read,
+ psem_write,
+ psem_ioctl,
+ psem_select,
+ psem_closefile,
+ psem_kqfilter,
+ NULL
+};
static lck_grp_t *psx_sem_subsys_lck_grp;
static lck_grp_attr_t *psx_sem_subsys_lck_grp_attr;
pinfo->psem_flags = PSEM_DEFINED | PSEM_INCREATE;
pinfo->psem_usecount = 1;
pinfo->psem_mode = cmode;
- pinfo->psem_uid = kauth_cred_getuid(kauth_cred_get());
- pinfo->psem_gid = kauth_cred_get()->cr_gid;
+ pinfo->psem_uid = kauth_getuid();
+ pinfo->psem_gid = kauth_getgid();
bcopy(pnbuf, &pinfo->psem_name[0], PSEMNAMLEN);
pinfo->psem_name[PSEMNAMLEN]= 0;
pinfo->psem_flags &= ~PSEM_DEFINED;
pinfo->psem_flags |= PSEM_ALLOCATED;
- pinfo->sem_proc = p;
+ pinfo->psem_creator_pid = p->p_pid;
+ pinfo->psem_creator_uniqueid = p->p_uniqueid;
#if CONFIG_MACF
error = mac_posixsem_check_create(kauth_cred_get(), nameptr);
proc_fdlock(p);
fp->f_flag = fmode & FMASK;
- fp->f_type = DTYPE_PSXSEM;
fp->f_ops = &psemops;
fp->f_data = (caddr_t)new_pnode;
procfdtbl_releasefd(p, indx, NULL);
static int
psem_access(struct pseminfo *pinfo, int mode, kauth_cred_t cred)
{
- mode_t mask;
- int is_member;
+ int mode_req = ((mode & FREAD) ? S_IRUSR : 0) |
+ ((mode & FWRITE) ? S_IWUSR : 0);
/* Otherwise, user id 0 always gets access. */
if (!suser(cred, NULL))
return (0);
- mask = 0;
-
- /* Otherwise, check the owner. */
- if (kauth_cred_getuid(cred) == pinfo->psem_uid) {
- if (mode & FREAD)
- mask |= S_IRUSR;
- if (mode & FWRITE)
- mask |= S_IWUSR;
- return ((pinfo->psem_mode & mask) == mask ? 0 : EACCES);
- }
-
- /* Otherwise, check the groups. */
- if (kauth_cred_ismember_gid(cred, pinfo->psem_gid, &is_member) == 0 && is_member) {
- if (mode & FREAD)
- mask |= S_IRGRP;
- if (mode & FWRITE)
- mask |= S_IWGRP;
- return ((pinfo->psem_mode & mask) == mask ? 0 : EACCES);
- }
-
- /* Otherwise, check everyone else. */
- if (mode & FREAD)
- mask |= S_IROTH;
- if (mode & FWRITE)
- mask |= S_IWOTH;
- return ((pinfo->psem_mode & mask) == mask ? 0 : EACCES);
+ return(posix_cred_access(cred, pinfo->psem_uid, pinfo->psem_gid, pinfo->psem_mode, mode_req));
}
int
proc_fdunlock(p);
return(error);
}
+ procfdtbl_markclosefd(p, fd);
fileproc_drain(p, fp);
fdrelse(p, fd);
error = closef_locked(fp, fp->f_fglob, p);
- FREE_ZONE(fp, sizeof *fp, M_FILEPROC);
+ fileproc_free(fp);
proc_fdunlock(p);
return(error);
}