aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward Tomasz Napierala <trasz@FreeBSD.org>2015-10-10 09:29:47 +0000
committerEdward Tomasz Napierala <trasz@FreeBSD.org>2015-10-10 09:29:47 +0000
commit92001b9497ae99ff4a5b7d4530da5440a00c4a6a (patch)
tree71f15ec0326af81711d733a2fc4503f4baed3c8c
parentb9a5c7b5954aac92d0b0508bc21b4ccc9a8ebd92 (diff)
downloadsrc-92001b9497ae99ff4a5b7d4530da5440a00c4a6a.tar.gz
src-92001b9497ae99ff4a5b7d4530da5440a00c4a6a.zip
Change the default setting of kern.ipc.shm_allow_removed from 0 to 1.
This removes the need for manually changing this flag for Google Chrome users. It also improves compatibility with Linux applications running under Linuxulator compatibility layer, and possibly also helps in porting software from Linux. Generally speaking, the flag allows applications to create the shared memory segment, attach it, remove it, and then continue to use it and to reattach it later. This means that the kernel will automatically "clean up" after the application exits. It could be argued that it's against POSIX. However, SUSv3 says this about IPC_RMID: "Remove the shared memory identifier specified by shmid from the system and destroy the shared memory segment and shmid_ds data structure associated with it." From my reading, we break it in any case by deferring removal of the segment until it's detached; we won't break it any more by also deferring removal of the identifier. This is the behaviour exhibited by Linux since... probably always, and also by OpenBSD since the following commit: revision 1.54 date: 2011/10/27 07:56:28; author: robert; state: Exp; lines: +3 -8; Allow segments to be used even after they were marked for deletion with the IPC_RMID flag. This is permitted as an extension beyond the standards and this is similar to what other operating systems like linux do. MFC after: 1 month Relnotes: yes Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D3603
Notes
Notes: svn path=/head/; revision=289112
-rw-r--r--lib/libc/sys/shmctl.211
-rw-r--r--sys/kern/sysv_shm.c2
2 files changed, 8 insertions, 5 deletions
diff --git a/lib/libc/sys/shmctl.2 b/lib/libc/sys/shmctl.2
index 98ddf13e8ec4..788e79f1900d 100644
--- a/lib/libc/sys/shmctl.2
+++ b/lib/libc/sys/shmctl.2
@@ -25,7 +25,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd July 17, 1995
+.Dd October 10, 2015
.Dt SHMCTL 2
.Os
.Sh NAME
@@ -72,15 +72,18 @@ or it must have superuser privileges.
.It Dv IPC_RMID
Removes the segment from the system.
The removal will not take
-effect until all processes having attached the segment have exited;
-however, once the IPC_RMID operation has taken place, no further
-processes will be allowed to attach the segment.
+effect until all processes having attached the segment have exited.
For the operation
to succeed, the calling process's effective uid must match
.Fa shm_perm.uid
or
.Fa shm_perm.cuid ,
or the process must have superuser privileges.
+If the
+.Va kern.ipc.shm_allow_removed
+.Xr sysctl 3
+variable is set to 0, once the IPC_RMID operation has taken place,
+no further processes will be allowed to attach the segment.
.\" .It Dv SHM_LOCK
.\" Locks the segment in memory. The calling process must have
.\" superuser privileges. Not implemented in FreeBSD.
diff --git a/sys/kern/sysv_shm.c b/sys/kern/sysv_shm.c
index 3d5dd11a2edb..b426f4561ef1 100644
--- a/sys/kern/sysv_shm.c
+++ b/sys/kern/sysv_shm.c
@@ -162,7 +162,7 @@ struct shminfo shminfo = {
};
static int shm_use_phys;
-static int shm_allow_removed;
+static int shm_allow_removed = 1;
SYSCTL_ULONG(_kern_ipc, OID_AUTO, shmmax, CTLFLAG_RWTUN, &shminfo.shmmax, 0,
"Maximum shared memory segment size");