- error = EEXIST;
- PSHM_SUBSYS_UNLOCK();
- goto bad1;
- }
- if (!incache) {
- PSHM_SUBSYS_UNLOCK();
- /* create a new one */
- MALLOC(pinfo, struct pshminfo *, sizeof(struct pshminfo), M_SHM, M_WAITOK|M_ZERO);
- if (pinfo == NULL) {
- error = ENOSPC;
- goto bad1;
- }
- PSHM_SUBSYS_LOCK();
- pinfo_alloc = 1;
- pinfo->pshm_flags = PSHM_DEFINED | PSHM_INCREATE;
- pinfo->pshm_usecount = 1; /* existence reference */
- pinfo->pshm_mode = cmode;
- pinfo->pshm_uid = kauth_cred_getuid(kauth_cred_get());
- pinfo->pshm_gid = kauth_cred_get()->cr_gid;
- } else {
- /* already exists */
- if( pinfo->pshm_flags & PSHM_INDELETE) {
- PSHM_SUBSYS_UNLOCK();
- error = ENOENT;
- goto bad1;
- }
- AUDIT_ARG(posix_ipc_perm, pinfo->pshm_uid,
- pinfo->pshm_gid, pinfo->pshm_mode);
- if ( (error = pshm_access(pinfo, fmode, kauth_cred_get(), p)) ) {
- PSHM_SUBSYS_UNLOCK();
- goto bad1;
- }
- }
+ error = EEXIST;
+ PSHM_SUBSYS_UNLOCK();
+ goto bad1;
+ }
+ if (!incache) {
+ PSHM_SUBSYS_UNLOCK();
+ /* create a new one */
+ MALLOC(pinfo, struct pshminfo *, sizeof(struct pshminfo), M_SHM, M_WAITOK|M_ZERO);
+ if (pinfo == NULL) {
+ error = ENOSPC;
+ goto bad1;
+ }
+ PSHM_SUBSYS_LOCK();
+ pinfo_alloc = 1;
+ pinfo->pshm_flags = PSHM_DEFINED | PSHM_INCREATE;
+ pinfo->pshm_usecount = 1; /* existence reference */
+ pinfo->pshm_mode = cmode;
+ pinfo->pshm_uid = kauth_cred_getuid(kauth_cred_get());
+ pinfo->pshm_gid = kauth_cred_get()->cr_gid;
+ bcopy(pnbuf, &pinfo->pshm_name[0], PSHMNAMLEN);
+ pinfo->pshm_name[PSHMNAMLEN]=0;
+#if CONFIG_MACF
+ PSHM_SUBSYS_UNLOCK();
+ mac_posixshm_label_init(pinfo);
+ PSHM_SUBSYS_LOCK();
+ error = mac_posixshm_check_create(kauth_cred_get(), nameptr);
+ if (error) {
+ PSHM_SUBSYS_UNLOCK();
+ goto bad2;
+ }
+ mac_posixshm_label_associate(kauth_cred_get(), pinfo, nameptr);
+#endif
+ } else {
+ /* already exists */
+ if( pinfo->pshm_flags & PSHM_INDELETE) {
+ PSHM_SUBSYS_UNLOCK();
+ error = ENOENT;
+ goto bad1;
+ }
+ AUDIT_ARG(posix_ipc_perm, pinfo->pshm_uid,
+ pinfo->pshm_gid, pinfo->pshm_mode);
+#if CONFIG_MACF
+ if ((error = mac_posixshm_check_open(
+ kauth_cred_get(), pinfo))) {
+ PSHM_SUBSYS_UNLOCK();
+ goto bad1;
+ }
+#endif
+ if ( (error = pshm_access(pinfo, fmode, kauth_cred_get(), p)) ) {
+ PSHM_SUBSYS_UNLOCK();
+ goto bad1;
+ }
+ }