freebsd-dev/usr.bin
John Baldwin 6bc1e9cd84 Rework the lifetime management of the kernel implementation of POSIX
semaphores.  Specifically, semaphores are now represented as new file
descriptor type that is set to close on exec.  This removes the need for
all of the manual process reference counting (and fork, exec, and exit
event handlers) as the normal file descriptor operations handle all of
that for us nicely.  It is also suggested as one possible implementation
in the spec and at least one other OS (OS X) uses this approach.

Some bugs that were fixed as a result include:
- References to a named semaphore whose name is removed still work after
  the sem_unlink() operation.  Prior to this patch, if a semaphore's name
  was removed, valid handles from sem_open() would get EINVAL errors from
  sem_getvalue(), sem_post(), etc.  This fixes that.
- Unnamed semaphores created with sem_init() were not cleaned up when a
  process exited or exec'd.  They were only cleaned up if the process
  did an explicit sem_destroy().  This could result in a leak of semaphore
  objects that could never be cleaned up.
- On the other hand, if another process guessed the id (kernel pointer to
  'struct ksem' of an unnamed semaphore (created via sem_init)) and had
  write access to the semaphore based on UID/GID checks, then that other
  process could manipulate the semaphore via sem_destroy(), sem_post(),
  sem_wait(), etc.
- As part of the permission check (UID/GID), the umask of the proces
  creating the semaphore was not honored.  Thus if your umask denied group
  read/write access but the explicit mode in the sem_init() call allowed
  it, the semaphore would be readable/writable by other users in the
  same group, for example.  This includes access via the previous bug.
- If the module refused to unload because there were active semaphores,
  then it might have deregistered one or more of the semaphore system
  calls before it noticed that there was a problem.  I'm not sure if
  this actually happened as the order that modules are discovered by the
  kernel linker depends on how the actual .ko file is linked.  One can
  make the order deterministic by using a single module with a mod_event
  handler that explicitly registers syscalls (and deregisters during
  unload after any checks).  This also fixes a race where even if the
  sem_module unloaded first it would have destroyed locks that the
  syscalls might be trying to access if they are still executing when
  they are unloaded.

  XXX: By the way, deregistering system calls doesn't do any blocking
  to drain any threads from the calls.
- Some minor fixes to errno values on error.  For example, sem_init()
  isn't documented to return ENFILE or EMFILE if we run out of semaphores
  the way that sem_open() can.  Instead, it should return ENOSPC in that
  case.

Other changes:
- Kernel semaphores now use a hash table to manage the namespace of
  named semaphores nearly in a similar fashion to the POSIX shared memory
  object file descriptors.  Kernel semaphores can now also have names
  longer than 14 chars (up to MAXPATHLEN) and can include subdirectories
  in their pathname.
- The UID/GID permission checks for access to a named semaphore are now
  done via vaccess() rather than a home-rolled set of checks.
- Now that kernel semaphores have an associated file object, the various
  MAC checks for POSIX semaphores accept both a file credential and an
  active credential.  There is also a new posixsem_check_stat() since it
  is possible to fstat() a semaphore file descriptor.
- A small set of regression tests (using the ksem API directly) is present
  in src/tools/regression/posixsem.

Reported by:	kris (1)
Tested by:	kris
Reviewed by:	rwatson (lightly)
MFC after:	1 month
2008-06-27 05:39:04 +00:00
..
alias Use the "builtin" shell function to make sure that the requested 2005-10-24 22:32:19 +00:00
apply It's `apply echo *'' that is similar to ls -1'', not `apply echo a*''. 2006-12-13 08:13:14 +00:00
ar GNU ar did NOT implment option -q as a synonym of -r as the manual 2008-03-11 18:35:51 +00:00
asa Sync program's usage() with manpage's SYNOPSIS. 2005-05-21 09:55:10 +00:00
at Use NULL instead of 0 for the return value of fopen(). 2007-09-21 01:55:11 +00:00
atm
awk Allow awk (the one true one!) to handle 64 files instead of just 20. 2008-03-27 01:33:26 +00:00
banner o Check that -w width is not above maximum. Use DWIDTH instead of 2006-11-22 21:05:17 +00:00
basename Cross-reference basename(3) and dirname(3). 2006-03-16 17:21:52 +00:00
biff Fix markup. 2006-12-28 04:58:38 +00:00
bluetooth Make -t <tty> optional in server mode. If not specified use stdin/stdout. 2008-05-14 16:47:30 +00:00
brandelf Fix markup. 2007-03-09 14:36:18 +00:00
bsdiff Portability fix for non-POSIX operating systems: Open files in binary mode. 2006-12-05 20:22:14 +00:00
bzip2 Update for bzip2 1.0.4 import. 2007-03-28 07:48:03 +00:00
bzip2recover
c89 Reduce diffs with c99(1). 2007-03-10 07:10:01 +00:00
c99 Bump the original revision of c89(1). 2007-03-10 07:11:20 +00:00
calendar Add myself. Better late then never. 2008-06-19 17:10:05 +00:00
cap_mkdb
catman Prepare for MACHINE and hw.machine switching to "pc98" on FreeBSD/pc98. 2005-12-05 14:22:12 +00:00
chat Merge revisions 1.10 and 1.11 from DragonFly: 2008-03-07 00:01:19 +00:00
checknr Fix some "in in" typos in comments. 2008-03-26 07:32:08 +00:00
chkey Reimplementation of world/kernel build options. For details, see: 2006-03-17 18:54:44 +00:00
chpass Fix bug introduced in rev 1.23: 2006-09-25 15:06:24 +00:00
cksum Change a use of u_int32_t to uint32_t. 2008-05-15 20:04:36 +00:00
cmp Refine markup and add the EXIT STATUS section where appropriate. 2006-12-19 10:34:14 +00:00
col The variables i and tot don't need to be static. 2006-07-18 07:16:25 +00:00
colcrt
colldef follow style(9) more closely and list sys/types.h first after sys/defs.h. 2008-01-01 10:04:10 +00:00
colrm
column Fix the fix in rev. 1.15 so that we jump to the next column 2006-12-15 17:47:25 +00:00
comm Similar to changes previously made to src/usr.bin/uniq/uniq.c, 2008-05-28 14:13:35 +00:00
compile_et Style: move .PATH to where it belongs. 2005-10-14 15:50:22 +00:00
compress -mdoc sweep. 2005-11-18 10:36:29 +00:00
cpio As reported by Alexey Shuvaev, -dumpl overwrote files after 2008-06-26 15:46:01 +00:00
cpuset - Add support for interrupt bindig to cpuset(1). Interrupts are bound 2008-04-11 03:27:42 +00:00
csplit
csup Update make glue for csup-snap-20060313. 2006-03-14 03:53:50 +00:00
ctags cleanup code: remove unnecessary and useless void cast 2007-02-04 20:07:07 +00:00
cut - Adopt the short description from POSIX as it better matches the 2007-02-28 10:13:32 +00:00
dig Update bmake glue for the BIND 9.4.1 import. 2007-06-02 23:19:58 +00:00
dirname Sync program's usage() with manpage's SYNOPSIS. 2005-05-21 09:55:10 +00:00
du Implement from scratch a -l option for du(1), to match the same option 2008-02-25 19:06:43 +00:00
ee Correct insecure temporary file usage in texindex. [06:01] 2006-01-11 08:02:16 +00:00
elf2aout Because optarg and optind are defined in unistd.h, 2006-04-21 09:39:51 +00:00
elfdump s/DT_IA64_PLT_RESERVE/DT_IA_64_PLT_RESERVE/ 2006-01-28 17:58:22 +00:00
enigma Markup nits. 2006-12-24 19:55:38 +00:00
env Update the date on the man-page to reflect the date that the '-u name' 2008-05-06 16:06:02 +00:00
expand Document that unexpand(1)'s -a and -t options are exclusive. 2006-10-13 16:22:25 +00:00
false
fetch List all environment variables supported by libfetch, along with a reference 2007-12-28 19:47:37 +00:00
file Christos decided to keep the manpages in mdoc(7) format, 2008-01-30 12:56:59 +00:00
file2c Apply style(9) to usage(), fix markup of the manpage. 2007-10-30 17:49:00 +00:00
find Fix SYNOPSIS and usage(). 2008-03-03 08:32:58 +00:00
finger Restore the ".Sh BUGS" line that was accidentally removed 2007-04-12 08:22:49 +00:00
fmt Prevent strange crashes in fmt with absurd goal lengths introduced by the 2007-10-17 11:41:40 +00:00
fold Mention what underlining is meant here. 2006-12-15 11:23:59 +00:00
from Improve markup. 2006-12-18 15:36:31 +00:00
fstat Struct cdev is always the member of the struct cdev_priv. When devfs 2008-06-16 17:34:59 +00:00
fsync
ftp Obey MK_INET6_SUPPORT. 2006-07-27 14:20:14 +00:00
gcore Eliminate memory leak from an accidental malloc(). 2007-04-10 17:37:53 +00:00
gencat Our bsd.*.mk only supports 6 WARNS levels and we should not use higher values 2005-06-30 11:56:31 +00:00
getconf o confstr(3) returns 0 on error. Check the return value accordingly. 2006-12-06 12:00:26 +00:00
getent cleanup code: remove superfluous comma at end of enumeration 2007-02-04 20:52:57 +00:00
getopt getopt.c is public domain. Add a comment to that effect. 2008-05-15 19:27:52 +00:00
gprof Add mips support. 2008-04-04 21:33:41 +00:00
gzip Teach gunzip that .tbz and .tbz2 uncompress to .tar, in a manner similar to 2008-03-09 13:49:09 +00:00
head Fix build on architectures where off_t is signed by casting to uintmax_t 2007-01-11 20:23:01 +00:00
hesinfo
hexdump Document the -d option. 2006-12-24 14:23:35 +00:00
host Update bmake glue for the BIND 9.4.1 import. 2007-06-02 23:19:58 +00:00
id Fix id -A when the subject has an extended subject token associated with 2007-10-14 00:52:30 +00:00
indent initialize variable (WARNS=6) 2006-09-13 05:06:12 +00:00
ipcrm Add the ability to clean up all shared memory segments which are 2007-12-25 00:52:24 +00:00
ipcs Add the ability to clean up all shared memory segments which are 2007-12-25 00:52:24 +00:00
join Improve markup and do some minor wordsmithing. 2006-12-21 10:59:48 +00:00
jot Use explicit braces to avoid ambiguous else. 2006-12-09 15:23:20 +00:00
kdump Remove netatm from HEAD as it is not MPSAFE and relies on the now removed 2008-05-25 22:11:40 +00:00
keylogin
keylogout
killall Fix a typo. 2007-11-09 16:31:47 +00:00
ktrace Spell -t option's argument by name. 2008-04-02 09:41:29 +00:00
ktrdump Skip format flags, when parsing ktr_desc. 2006-01-12 22:32:07 +00:00
lam Document that jot(1), rs(1), and lam(1) first appeared in 4.2BSD. 2006-10-20 04:31:01 +00:00
last
lastcomm Increase precision of time values in the process accounting 2007-05-22 06:51:38 +00:00
ldd Typo 2008-05-15 10:51:30 +00:00
leave
less Resolve conflicts; Update defines.h to reflect latest change. 2007-11-16 22:24:31 +00:00
lessecho Hook lessecho(1) to build. 2006-08-20 15:52:17 +00:00
lesskey
lex I missed some "register"s in non-dot-C files. 2008-06-08 19:59:15 +00:00
limits Significantly reduce the memory leak as noted in BUGS section for 2007-07-04 00:00:41 +00:00
locale Xref setlocale(3), bump document date. 2005-11-01 19:36:17 +00:00
locate The previous version included too many file system types in the scan, 2007-10-17 07:27:51 +00:00
lock
lockf Also fix a "blank line" issue that sneaked in from rev. 1.19. 2007-10-31 19:26:01 +00:00
logger Minor style(9) nit. 2008-02-05 17:34:44 +00:00
login Add a cross-reference to newgrp(1). 2007-11-30 11:02:36 +00:00
logins
logname Say "utility", not "function". 2006-12-26 10:37:37 +00:00
look Remove break after return. 2006-07-18 10:19:46 +00:00
lorder Document the NM environment variable. 2006-10-25 09:40:07 +00:00
lsvfs Fix (uncritical) potential buffer overflow: the length of "buf" was not 2007-11-15 07:31:11 +00:00
m4 Use NULL instead of 0 for the return value of fopen(). 2007-09-21 01:55:11 +00:00
mail Use static storage-class specifier where appropriate. 2007-11-08 11:13:03 +00:00
make Fix splitting into words of the .for expression to allow for 2008-03-24 12:33:28 +00:00
makewhatis Teach makewhatis.c to treat .SS with the same severity as .SH. 2007-10-18 12:53:11 +00:00
mesg Sync program's usage() with manpage's SYNOPSIS. 2005-05-21 09:55:10 +00:00
minigzip
ministat Fix apparent typo. The permitted confidence values include 95%, not 85%. 2008-03-12 00:13:49 +00:00
mkdep
mkfifo Fix markup. 2006-12-15 14:14:17 +00:00
mklocale Understand newly introduced "ASCII" encoding 2008-01-22 00:04:50 +00:00
mkstr More markup fixes. 2007-03-04 08:24:13 +00:00
mktemp Markup fixes. 2006-09-29 15:20:48 +00:00
mkuzip Support character device as input file. 2007-03-06 17:04:15 +00:00
msgs Never use getenv("HOME") without checking for NULL and non-zero 2007-10-30 03:44:10 +00:00
mt Note what options are only for DDS drives. 2008-01-21 22:08:05 +00:00
nc
ncal Document incorrect handling of multibyte characters. 2005-10-23 01:37:25 +00:00
ncplist getopt(3) returns -1, not EOF when out of args. 2007-02-05 07:35:23 +00:00
ncplogin getopt(3) returns -1, not EOF. 2008-02-19 07:09:19 +00:00
netstat Update the kernel to count the number of mbufs and clusters 2008-05-15 20:18:44 +00:00
newgrp
newkey Reimplementation of world/kernel build options. For details, see: 2006-03-17 18:54:44 +00:00
nfsstat Add a -z flag to nfsstat which zeros the NFS statistics after displaying 2007-10-18 16:38:07 +00:00
nice Sync program's usage() with manpage's SYNOPSIS. 2005-05-21 09:55:10 +00:00
nl o Really commit typo fixes to HEAD. 2007-03-25 18:37:59 +00:00
nohup
nslookup Update bmake glue for the BIND 9.4.1 import. 2007-06-02 23:19:58 +00:00
nsupdate Update bmake glue for the BIND 9.4.1 import. 2007-06-02 23:19:58 +00:00
objformat Bah. Kris says the default-to-a.out knowledge has migrated into the 2007-01-25 23:12:19 +00:00
opieinfo
opiekey
opiepasswd
pagesize
passwd Markup nits. 2007-11-07 07:59:38 +00:00
paste WARNS=6 chocked on unitialized variable. 2006-09-12 05:08:36 +00:00
pathchk Sync program's usage() with manpage's SYNOPSIS. 2005-05-21 09:55:10 +00:00
pkill Be more accurate in the description of the -I option: 2006-12-20 11:57:22 +00:00
pr Fix misspelled 'argument' and try to make the sentence into English. 2005-10-26 17:37:54 +00:00
printenv Simplify. 2006-12-26 12:43:12 +00:00
printf Prefer {u,}intmax_t over the deprecated {u_,}quad_t. 2005-08-05 08:18:00 +00:00
procstat Rework the lifetime management of the kernel implementation of POSIX 2008-06-27 05:39:04 +00:00
quota Make the human readable numbers printed with the -h option a bit 2008-02-18 01:36:40 +00:00
renice Sync program's usage() with manpage's SYNOPSIS. 2005-05-21 09:55:10 +00:00
rev Make usage() 'static'. 2008-06-08 12:43:02 +00:00
rlogin len and len2 work better as size_t 2005-11-13 21:03:56 +00:00
rpcgen Generate code that doesn't fail gcc 4.2's strict aliasing test. 2007-11-20 01:46:12 +00:00
rpcinfo rpcinfo(1) doesn't depend on INET6 explicitly. 2006-07-27 13:47:02 +00:00
rs Document that jot(1), rs(1), and lam(1) first appeared in 4.2BSD. 2006-10-20 04:31:01 +00:00
rsh - Remove MLINKS to nonexistant manpages 2005-07-14 20:29:08 +00:00
rup Backport markup fixes from a translated version of a manpage. 2007-02-28 10:22:19 +00:00
ruptime Initialize variable "now" before using it (it is used by the LEFTEARTH 2008-03-17 18:31:43 +00:00
rusers Sync program's usage() with manpage's SYNOPSIS. 2005-05-21 09:55:10 +00:00
rwall Sync program's usage() with manpage's SYNOPSIS. 2005-05-21 09:55:10 +00:00
rwho It's actually 11 minutes when the machine is assumed to be down and removed 2005-08-07 11:48:44 +00:00
script
sed WARNS fixes: 2008-02-09 09:12:02 +00:00
setchannel Add support for selecting from multiple tuners. 2007-02-25 01:28:37 +00:00
shar Remove superfluous eofmarker. 2008-06-17 18:56:04 +00:00
showmount Sync program's usage() with manpage's SYNOPSIS. 2005-05-21 09:55:10 +00:00
smbutil Make smbfs capable to use 16bit char set in filenames. 2005-05-04 15:05:46 +00:00
sockstat Add -L to usage(). 2008-05-19 11:35:11 +00:00
split Add a -n option to split(1) to split files into N chunks rather than 2008-03-16 15:15:32 +00:00
stat The referenced section name is 'Formats', not 'FORMATS'. 2008-04-29 07:35:31 +00:00
su Fix a strict aliasing warning - I think it is really telling us 2008-06-04 19:16:54 +00:00
systat ANSIfy and remove register. 2008-01-16 19:27:43 +00:00
tabs
tail Nuking the temporary pointer once it is properly tracked in local storage. 2007-11-22 01:51:46 +00:00
talk ANSIfy function prototypes. While I am there, constify some parameters and 2008-04-28 21:08:42 +00:00
tar Pass the entry down into the core write loop, so we 2008-06-25 05:01:02 +00:00
tcopy Document some details better, making it easier to translate. 2006-12-20 15:34:01 +00:00
tee - Steal short description from POSIX; it's more technical and was 2007-11-13 11:34:20 +00:00
telnet Fix conflicts after heimdal-1.1 import and add build infrastructure. Import 2008-05-07 13:53:12 +00:00
tftp Fix markup. 2007-11-07 07:56:57 +00:00
time Cast to intmax_t to print tv_sec in struct timeval. 2007-05-07 12:23:23 +00:00
tip Relinquish exclusive TTY access when tip(1) or cu(1) exit. 2008-05-03 02:29:02 +00:00
top system_info.cpustates isn't sparse, so a bitmask of available CPU states 2008-04-11 11:39:26 +00:00
touch Update to match revision 1.23 of touch.c. 2007-04-10 07:24:47 +00:00
tput At least one argument is required. 2006-10-12 21:10:55 +00:00
tr o Remove duplicate includes. 2007-01-20 08:24:02 +00:00
true
truncate The -r option can also cause the files to be extended (not 2006-12-19 11:20:34 +00:00
truss Retire some stale alpha references. 2008-05-16 20:09:29 +00:00
tset Reduce compiler warning: variable might be used uninitialized, by giving 2005-05-29 15:49:53 +00:00
tsort - Remove the ambiguity in the input format description. 2006-12-27 14:56:18 +00:00
tty Fix markup nits, add the EXIT STATUS section. 2006-12-13 20:15:49 +00:00
ul Fix markup. 2007-02-27 12:06:02 +00:00
uname
unexpand Document that unexpand(1)'s -a and -t options are exclusive. 2006-10-13 16:22:25 +00:00
unifdef Add AUTHORS section[*] and fix HISTORY section. 2008-05-02 16:23:47 +00:00
uniq Fix truncation of lines at LINE_MAX characters by dynamically 2008-02-08 23:04:13 +00:00
units
unvis
unzip Welcome unzip(1), a pure BSD drop-in replacement for ports/unzip. In its 2008-01-08 08:00:06 +00:00
usbhidaction Add support using an alternate table file to usbhidaction(1). 2007-06-30 03:58:01 +00:00
usbhidctl usbhidctl appears to not report features and write size correctly 2007-12-21 03:40:36 +00:00
users
uudecode
uuencode - Remove MLINKS to nonexistant manpages 2005-07-14 20:29:08 +00:00
vacation Remove kludges intended to support src trees with partial obj trees. 2005-06-10 06:12:53 +00:00
vgrind Manual page tweaks. 2006-08-29 18:11:20 +00:00
vi
vis Nits. 2006-12-23 19:15:39 +00:00
vmstat Add forgotten -H, -h, and -P to usage(). 2008-04-10 09:56:57 +00:00
w Fix markup. 2006-12-14 19:02:48 +00:00
wall Fix some bugs in wall(1): 2008-01-15 07:40:30 +00:00
wc Prevent a line from being broken on a line boundary. 2006-12-21 22:59:07 +00:00
what Polish markup and wording. 2006-12-14 00:02:44 +00:00
whereis Make the search for sources in PATH_PORTS more accurate. I only 2008-06-20 08:39:42 +00:00
which Refine the previous revision. 2006-12-13 12:09:41 +00:00
who In wall and who, check that the utmp entry isn't stalled, as it is done in w. 2006-02-21 13:01:00 +00:00
whois Use proper type cast for ctype macro 2007-04-14 14:32:48 +00:00
window Fixes for gcc 4.x. 2005-08-25 14:09:35 +00:00
write write(1) needs to strip off the leading /dev/ from the tty name for the 2007-11-12 20:02:21 +00:00
xargs Revive '-opt' flags which I accidentally removed. 2008-01-27 16:20:36 +00:00
xinstall Give a better description when a install of multiple files fails 2007-12-14 08:46:57 +00:00
xlint MFp4(mips2-jnpr): 2008-04-04 21:35:13 +00:00
xstr Improve temporary file handling 2008-05-13 09:42:03 +00:00
yacc
yes
ypcat Sync program's usage() with manpage's SYNOPSIS. 2005-05-21 09:55:10 +00:00
ypmatch Sync program's usage() with manpage's SYNOPSIS. 2005-05-21 09:55:10 +00:00
ypwhich Fix markup nit. 2006-12-28 10:58:06 +00:00
Makefile 1. Make the BSD version of cpio the default [1] 2008-06-16 05:48:15 +00:00
Makefile.inc