Home | History | Annotate | Download | only in kern
History log of /src/sys/kern/sys_mqueue.c
RevisionDateAuthorComments
 1.49  01-Jul-2024  christos Add linux POSIX message queue support (Ricardo Branco)
 1.48  23-May-2020  ad branches: 1.48.26;
Move proc_lock into the data segment. It was dynamically allocated because
at the time we had mutex_obj_alloc() but not __cacheline_aligned.
 1.47  16-May-2020  christos Add ACL support for FFS. From FreeBSD.
 1.46  16-Mar-2020  pgoyette Use the module subsystem's ability to process SYSCTL_SETUP() entries to
automate installation of sysctl nodes.

Note that there are still a number of device and pseudo-device modules
that create entries tied to individual device units, rather than to the
module itself. These are not changed.
 1.45  15-Sep-2019  christos Prevent O_EXEC for mq_open(2), and O_EXEC with a writable fd for open(2).
 1.44  16-Apr-2019  martin mq_send1: fix argument validation and reject too large lengths early.
Discovered by Andy Nguyen.
 1.43  19-Aug-2018  jakllsch Handle p->p_mqueue_cnt in a symmetric manner.

While this change does mean that each open mqd_t counts against the
limit, it also means that p_mqueue_cnt will never wrap below 0.

Discovered by the Rust nix crate test suite. It opens the same mq twice
(once for writes, once for reads), and then proceeds to close each of
them, which resulted in p_mqueue_cnt wrapping to (u_int)-1, preventing
the process from opening any more mqueues, and all subsequent
mq(3)-related tests to fail.
 1.42  04-Jul-2018  kamil Avoid undefined behavior in mq_send1()

Do not shift a signed integer causing change of the signed bit.

sys/kern/sys_mqueue.c:881:23, left shift of 1 by 31 places cannot be represented in type 'int'

Detected with Kernel Undefined Behavior Sanitizer.

Reported by <Harry Pantazis>
 1.41  04-Jul-2018  kamil Avoid undefined behavior in mq_recv1()

Do not shift a signed integer causing change of the signed bit.

sys/kern/sys_mqueue.c:712:24, left shift of 1 by 31 places cannot be represented in type 'int'

Detected with Kernel Undefined Behavior Sanitizer.

Reported by <Harry Pantazis>
 1.40  30-Nov-2017  christos branches: 1.40.2; 1.40.4;
add fo_name so we can identify the fileops in a simple way.
 1.39  29-Jun-2015  christos branches: 1.39.10;
CID 1308958: Fix reversed arguments in copyin(9)
 1.38  20-Jun-2015  martin Make mqueue_get public, rearrange mq_open into a helper function that can
be called from compat code, adapt mqueue_create accordingly.
 1.37  05-Sep-2014  matt branches: 1.37.2;
Try not to use f_data, use f_{vnode,socket,pipe,mqueue,kqueue,ksem} to get
a correctly typed pointer.
 1.36  25-Feb-2014  pooka branches: 1.36.4; 1.36.6; 1.36.10;
Ensure that the top level sysctl nodes (kern, vfs, net, ...) exist before
the sysctl link sets are processed, and remove redundancy.

Shaves >13kB off of an amd64 GENERIC, not to mention >1k duplicate
lines of code.
 1.35  29-Mar-2013  christos branches: 1.35.4;
Centralize the computation of struct timespec to the int timo.
Make lwp_park take the regular arguments for specifying what kind
of timeout we supply like clock_nanosleep(), namely clockid_t and flags.
 1.34  13-Mar-2012  elad branches: 1.34.2;
Replace the remaining KAUTH_GENERIC_ISSUSER authorization calls with
something meaningful. All relevant documentation has been updated or
written.

Most of these changes were brought up in the following messages:

http://mail-index.netbsd.org/tech-kern/2012/01/18/msg012490.html
http://mail-index.netbsd.org/tech-kern/2012/01/19/msg012502.html
http://mail-index.netbsd.org/tech-kern/2012/02/17/msg012728.html

Thanks to christos, manu, njoly, and jmmv for input.

Huge thanks to pgoyette for spinning these changes through some build
cycles and ATF.
 1.33  25-Apr-2011  martin branches: 1.33.4; 1.33.8;
Add missing <sys/atomic.h> include.
 1.32  24-Apr-2011  rmind - Move some checks into mqueue_get() and avoid some duplication.
- Simplify message queue descriptor unlinking and closure operations.
- Update proc_t::p_mqueue_cnt atomically. Inherit it on fork().
- Use separate allocation for the name of message queue.
 1.31  18-Jan-2011  rmind mq_poll_fop: return only those events which are polled.
 1.30  28-Jul-2010  jruoho branches: 1.30.2;
Get rid of SYSCTL_SETUP.

We want the sysctl variables also when mqueue(3) is loaded as a module.
 1.29  20-Dec-2009  dsl branches: 1.29.2; 1.29.4;
If a multithreaded app closes an fd while another thread is blocked in
read/write/accept, then the expectation is that the blocked thread will
exit and the close complete.
Since only one fd is affected, but many fd can refer to the same file,
the close code can only request the fs code unblock with ERESTART.
Fixed for pipes and sockets, ERESTART will only be generated after such
a close - so there should be no change for other programs.
Also rename fo_abort() to fo_restart() (this used to be fo_drain()).
Fixes PR/26567
 1.28  10-Dec-2009  drochner fix some security critical bugs:
-an invalid signal number passed to mq_notify(2) could crash the kernel
on delivery -- add a boundary check
-mq_receive(2) from an empty queue crashed the kernel by NULL dereference
in timeout calculation -- handle the NULL case
-likewise for mq_send(2) to a full queue
-a user could set mq_maxmsg (the maximal number of messages in a queue)
to a huge value on mq_open(O_CREAT) and later use up all kernel
memory by mq_send(2) -- add a sysctl'able limit which defaults
to 16*mq_def_maxmsg

(mq_notify(2) should get some more checks, and SIGEV_* values other
than SIGEV_SIGNAL should be handled somehow, but this doesn't look
security critical)
 1.27  09-Dec-2009  dsl Rename fo_drain() to fo_abort(), 'drain' is used to mean 'wait for output
do drain' in many places, whereas fo_drain() was called in order to force
blocking read()/write() etc calls to return to userspace so that a close()
call from a different thread can complete.
In the sockets code comment out the broken code in the inner function,
it was being called from compat code.
 1.26  01-Nov-2009  rmind - Move inittimeleft() and gettimeleft() to subr_time.c, where they belong.
- Move abstimeout2timo() there too and export. Use it in lwp_park().
 1.25  05-Oct-2009  rmind mq_timedsend/mq_timedreceive: timeout value is absolute, not relative.
While here, drop unecessary (since fdesc API changes) lwp_t arguments.

Bug reported by Stathis Kamperis, thanks!
 1.24  19-Jul-2009  rmind Make POSIX message queues a kernel module.
 1.23  19-Jul-2009  rmind Fix previous, so that it actually works, correctly.
 1.22  13-Jul-2009  rmind - Make insertion to message queue O(1) by using bitmap and array. However,
mq_prio_max is dynamic, and sorted list is used for custom setup, when
user manually sets higher priority range.
- Cache mq->mq_attrib in some places. Change msg_ptr type to uint8_t.
- Update copyright, misc.
 1.21  13-Jul-2009  rmind mq_send/mq_receive: while permission may allow that, return EBADF if sending
to read-only queue, or receiving from write-only queue.

From Stathis Kamperis, thanks!
 1.20  03-Jul-2009  elad Message queues also use genfs_can_access() to control access. Since the
latter might lose its KAUTH_GENERIC_ISSUSER check soon, add an internal
function, mqueue_access(), and call genfs_can_access() from it instead
so we don't pollute the main code path once we need to add a special
kauth(9) check for message queues.

No functional change, error codes preserved.

Related mailing list thread:

http://mail-index.netbsd.org/tech-kern/2009/06/21/msg005311.html
 1.19  23-Jun-2009  elad Move the implementation of vaccess() to genfs_can_access(), in line with
the other routines of the same spirit.

Adjust file-system code to use it.

Keep vaccess() for KPI compatibility and to keep element of least
surprise. A "diagnostic" message warning that vaccess() is deprecated will
be printed when it's used (obviously, only in DIAGNOSTIC kernels).

No objections on tech-kern@:

http://mail-index.netbsd.org/tech-kern/2009/06/21/msg005310.html
 1.18  26-May-2009  rmind - Slightly rework the way permissions are checked. Neither mq_receive() not
mq_send() should fail due to permissions. Noted by Stathis Kamperis!
- Check for empty message queue name (POSIX does not allow this for regular
files, and it's weird), check for DTYPE_MQUEUE, fix permission check in
mq_unlink(), clean up.
 1.17  16-May-2009  rmind sys_mq_open: remove broken access flag check.
Noted by Stathis Kamperis.
 1.16  11-Apr-2009  christos Fix locking as Andy explained. Also fill in uid and gid like sys_pipe did.
 1.15  11-Apr-2009  christos Fix PR/37878 and PR/37550: Provide stat(2) for all devices and don't use
fbadop_stat.
 1.14  04-Apr-2009  ad Add fileops::fo_drain(), to be called from fd_close() when there is more
than one active reference to a file descriptor. It should dislodge threads
sleeping while holding a reference to the descriptor. Implemented only for
sockets but should be extended to pipes, fifos, etc.

Fixes the case of a multithreaded process doing something like the
following, which would have hung until the process got a signal.

thr0 accept(fd, ...)
thr1 close(fd)
 1.13  11-Jan-2009  christos branches: 1.13.2;
merge christos-time_t
 1.12  29-Sep-2008  rmind branches: 1.12.2; 1.12.4;
- Fix message queue permissions problems.
- Rake into account umask when creating mqueue.
- Restore DDB command, which was accidentally lost (hi martin).
- Misc.
 1.11  02-Jul-2008  rmind branches: 1.11.2;
mq_open: fix confusion of FREAD/FWRITE and VREAD/VWRITE.
 1.10  24-Apr-2008  ad branches: 1.10.2; 1.10.4; 1.10.6;
Network protocol interrupts can now block on locks, so merge the globals
proclist_mutex and proclist_lock into a single adaptive mutex (proc_lock).
Implications:

- Inspecting process state requires thread context, so signals can no longer
be sent from a hardware interrupt handler. Signal activity must be
deferred to a soft interrupt or kthread.

- As the proc state locking is simplified, it's now safe to take exit()
and wait() out from under kernel_lock.

- The system spends less time at IPL_SCHED, and there is less lock activity.
 1.9  27-Mar-2008  ad branches: 1.9.2; 1.9.4;
Replace use of CACHE_LINE_SIZE in some obvious places.
 1.8  23-Mar-2008  rmind - Support for select/poll.
- Convert pool to pool-cache.
- Wrap long lines, adjust the license.
 1.7  21-Mar-2008  ad Catch up with descriptor handling changes. See kern_descrip.c revision
1.173 for details.
 1.6  20-Dec-2007  dsl branches: 1.6.6;
Convert all the system call entry points from:
int foo(struct lwp *l, void *v, register_t *retval)
to:
int foo(struct lwp *l, const struct foo_args *uap, register_t *retval)
Fixup compat code to not write into 'uap' and (in some cases) to actually
pass a correctly formatted 'uap' structure with the right name to the
next routine.
A few 'compat' routines that just call standard ones have been deleted.
All the 'compat' code compiles (along with the kernels required to test
build it).
98% done by automated scripts.
 1.5  28-Nov-2007  rmind branches: 1.5.2; 1.5.6;
Unify the license: All rights reserved.
No functional change.
 1.4  11-Nov-2007  matt Change some initialization of static queues to compile time.
(xxx_INIT to xxx_HEAD_INITIALIZER). Drop code which inits
non-auto (global or static) variables to 0 since that's
already implied by being non-auto. Init some static/global
cpu_simple_locks at compile time.
 1.3  09-Oct-2007  rmind branches: 1.3.2; 1.3.4; 1.3.6; 1.3.8;
mq_receive1: Handle the possible dereference, when cv_timedwait_sig() awakes
normally (without the error) and MQ_UNLINK is set.
From CID: 4565.
 1.2  21-Sep-2007  ad branches: 1.2.2; 1.2.4; 1.2.6;
- mq_receive1, mq_send1: deal with spurious wakeup. XXX should adjust the
timeout but this is a wider problem.
- MQ_SEND is unused, remove it.
 1.1  07-Sep-2007  rmind branches: 1.1.2;
Implementation of POSIX message queues.

Reviewed by: <ad>, <tech-kern>
 1.1.2.2  10-Sep-2007  skrll Sync with HEAD.
 1.1.2.1  07-Sep-2007  skrll file sys_mqueue.c was added on branch nick-csl-alignment on 2007-09-10 10:56:02 +0000
 1.2.6.3  12-Oct-2007  ad Sync with head.
 1.2.6.2  09-Oct-2007  ad Sync with head.
 1.2.6.1  21-Sep-2007  ad file sys_mqueue.c was added on branch vmlocking on 2007-10-09 13:44:30 +0000
 1.2.4.5  03-Dec-2007  joerg Sync with HEAD.
 1.2.4.4  14-Nov-2007  joerg Sync with HEAD.
 1.2.4.3  26-Oct-2007  joerg Sync with HEAD.

Follow the merge of pmap.c on i386 and amd64 and move
pmap_init_tmp_pgtbl into arch/x86/x86/pmap.c. Modify the ACPI wakeup
code to restore CR4 before jumping back into kernel space as the large
page option might cover that.
 1.2.4.2  02-Oct-2007  joerg Sync with HEAD.
 1.2.4.1  21-Sep-2007  joerg file sys_mqueue.c was added on branch jmcneill-pm on 2007-10-02 18:29:04 +0000
 1.2.2.1  14-Oct-2007  yamt sync with head.
 1.3.8.3  09-Jan-2008  matt sync with HEAD
 1.3.8.2  06-Nov-2007  matt sync with HEAD
 1.3.8.1  09-Oct-2007  matt file sys_mqueue.c was added on branch matt-armv6 on 2007-11-06 23:32:30 +0000
 1.3.6.3  27-Dec-2007  mjf Sync with HEAD.
 1.3.6.2  08-Dec-2007  mjf Sync with HEAD.
 1.3.6.1  19-Nov-2007  mjf Sync with HEAD.
 1.3.4.6  24-Mar-2008  yamt sync with head.
 1.3.4.5  21-Jan-2008  yamt sync with head
 1.3.4.4  07-Dec-2007  yamt sync with head
 1.3.4.3  15-Nov-2007  yamt sync with head.
 1.3.4.2  27-Oct-2007  yamt sync with head.
 1.3.4.1  09-Oct-2007  yamt file sys_mqueue.c was added on branch yamt-lazymbuf on 2007-10-27 11:35:35 +0000
 1.3.2.1  13-Nov-2007  bouyer Sync with HEAD
 1.5.6.1  02-Jan-2008  bouyer Sync with HEAD
 1.5.2.1  26-Dec-2007  ad Sync with head.
 1.6.6.5  17-Jan-2009  mjf Sync with HEAD.
 1.6.6.4  05-Oct-2008  mjf Sync with HEAD.
 1.6.6.3  28-Sep-2008  mjf Sync with HEAD.
 1.6.6.2  02-Jun-2008  mjf Sync with HEAD.
 1.6.6.1  03-Apr-2008  mjf Sync with HEAD.
 1.9.4.1  18-May-2008  yamt sync with head.
 1.9.2.2  01-Nov-2008  christos Sync with head.
 1.9.2.1  29-Mar-2008  christos Welcome to the time_t=long long dev_t=uint64_t branch.
 1.10.6.1  03-Jul-2008  simonb Sync with head.
 1.10.4.2  10-Oct-2008  skrll Sync with HEAD.
 1.10.4.1  18-Sep-2008  wrstuden Sync with wrstuden-revivesa-base-2.
 1.10.2.6  11-Aug-2010  yamt sync with head.
 1.10.2.5  11-Mar-2010  yamt sync with head
 1.10.2.4  19-Aug-2009  yamt sync with head.
 1.10.2.3  18-Jul-2009  yamt sync with head.
 1.10.2.2  20-Jun-2009  yamt sync with head
 1.10.2.1  04-May-2009  yamt sync with head.
 1.11.2.1  19-Oct-2008  haad Sync with HEAD.
 1.12.4.6  10-Dec-2009  snj Pull up following revision(s) (requested by drochner in ticket #1188):
sys/kern/sys_mqueue.c: revision 1.28 via patch
fix some security critical bugs:
-an invalid signal number passed to mq_notify(2) could crash the kernel
on delivery -- add a boundary check
-mq_receive(2) from an empty queue crashed the kernel by NULL dereference
in timeout calculation -- handle the NULL case
-likewise for mq_send(2) to a full queue
-a user could set mq_maxmsg (the maximal number of messages in a queue)
to a huge value on mq_open(O_CREAT) and later use up all kernel
memory by mq_send(2) -- add a sysctl'able limit which defaults
to 16*mq_def_maxmsg
(mq_notify(2) should get some more checks, and SIGEV_* values other
than SIGEV_SIGNAL should be handled somehow, but this doesn't look
security critical)
 1.12.4.5  16-Oct-2009  snj Pull up following revision(s) (requested by rmind in ticket #1071):
sys/kern/sys_mqueue.c: revision 1.25 via patch
sys/sys/mqueue.h: revision 1.11 via patch
mq_timedsend/mq_timedreceive: timeout value is absolute, not relative.
While here, drop unecessary (since fdesc API changes) lwp_t arguments.
Bug reported by Stathis Kamperis, thanks!
 1.12.4.4  21-Jul-2009  snj Pull up following revision(s) (requested by rmind in ticket #857):
sys/kern/sys_mqueue.c: revision 1.21 via patch
mq_send/mq_receive: while permission may allow that, return EBADF if sending
to read-only queue, or receiving from write-only queue.
From Stathis Kamperis, thanks!
 1.12.4.3  27-May-2009  snj Pull up following revision(s) (requested by rmind in ticket #779):
sys/kern/sys_mqueue.c: revision 1.18
- Slightly rework the way permissions are checked. Neither mq_receive() not
mq_send() should fail due to permissions. Noted by Stathis Kamperis!
- Check for empty message queue name (POSIX does not allow this for regular
files, and it's weird), check for DTYPE_MQUEUE, fix permission check in
mq_unlink(), clean up.
 1.12.4.2  18-May-2009  bouyer Pull up following revision(s) (requested by rmind in ticket #762):
sys/kern/sys_mqueue.c: revision 1.17
sys_mq_open: remove broken access flag check.
Noted by Stathis Kamperis.
 1.12.4.1  04-Apr-2009  snj branches: 1.12.4.1.2;
Pull up following revision(s) (requested by ad in ticket #661):
sys/arch/xen/xen/xenevt.c: revision 1.32
sys/compat/svr4/svr4_net.c: revision 1.56
sys/compat/svr4_32/svr4_32_net.c: revision 1.19
sys/dev/dmover/dmover_io.c: revision 1.32
sys/dev/putter/putter.c: revision 1.21
sys/kern/kern_descrip.c: revision 1.190
sys/kern/kern_drvctl.c: revision 1.23
sys/kern/kern_event.c: revision 1.64
sys/kern/sys_mqueue.c: revision 1.14
sys/kern/sys_pipe.c: revision 1.109
sys/kern/sys_socket.c: revision 1.59
sys/kern/uipc_syscalls.c: revision 1.136
sys/kern/vfs_vnops.c: revision 1.164
sys/kern/uipc_socket.c: revision 1.188
sys/net/bpf.c: revision 1.144
sys/net/if_tap.c: revision 1.55
sys/opencrypto/cryptodev.c: revision 1.47
sys/sys/file.h: revision 1.67
sys/sys/param.h: patch
sys/sys/socketvar.h: revision 1.119
Add fileops::fo_drain(), to be called from fd_close() when there is more
than one active reference to a file descriptor. It should dislodge threads
sleeping while holding a reference to the descriptor. Implemented only for
sockets but should be extended to pipes, fifos, etc.
Fixes the case of a multithreaded process doing something like the
following, which would have hung until the process got a signal.
thr0 accept(fd, ...)
thr1 close(fd)
 1.12.4.1.2.4  18-Dec-2009  snj Pull up following revision(s) (requested by tron in ticket #1188):
sys/kern/sys_mqueue.c: revision 1.28 via patch
fix some security critical bugs:
-an invalid signal number passed to mq_notify(2) could crash the kernel
on delivery -- add a boundary check
-a user could set mq_maxmsg (the maximal number of messages in a queue)
to a huge value on mq_open(O_CREAT) and later use up all kernel
memory by mq_send(2) -- add a sysctl'able limit which defaults
to 16*mq_def_maxmsg
(mq_notify(2) should get some more checks, and SIGEV_* values other
than SIGEV_SIGNAL should be handled somehow, but this doesn't look
security critical)
 1.12.4.1.2.3  21-Jul-2009  snj branches: 1.12.4.1.2.3.2;
Pull up following revision(s) (requested by rmind in ticket #857):
sys/kern/sys_mqueue.c: revision 1.21 via patch
mq_send/mq_receive: while permission may allow that, return EBADF if sending
to read-only queue, or receiving from write-only queue.
From Stathis Kamperis, thanks!
 1.12.4.1.2.2  27-May-2009  snj Pull up following revision(s) (requested by rmind in ticket #779):
sys/kern/sys_mqueue.c: revision 1.18
- Slightly rework the way permissions are checked. Neither mq_receive() not
mq_send() should fail due to permissions. Noted by Stathis Kamperis!
- Check for empty message queue name (POSIX does not allow this for regular
files, and it's weird), check for DTYPE_MQUEUE, fix permission check in
mq_unlink(), clean up.
 1.12.4.1.2.1  18-May-2009  bouyer Pull up following revision(s) (requested by rmind in ticket #762):
sys/kern/sys_mqueue.c: revision 1.17
sys_mq_open: remove broken access flag check.
Noted by Stathis Kamperis.
 1.12.4.1.2.3.2.1  21-Apr-2010  matt sync to netbsd-5
 1.12.2.2  28-Apr-2009  skrll Sync with HEAD.
 1.12.2.1  19-Jan-2009  skrll Sync with HEAD.
 1.13.2.2  23-Jul-2009  jym Sync with HEAD.
 1.13.2.1  13-May-2009  jym Sync with HEAD.

Commit is split, to avoid a "too many arguments" protocol error.
 1.29.4.2  31-May-2011  rmind sync with head
 1.29.4.1  05-Mar-2011  rmind sync with head
 1.29.2.1  17-Aug-2010  uebayasi Sync with HEAD.
 1.30.2.1  06-Jun-2011  jruoho Sync with HEAD.
 1.33.8.1  05-Apr-2012  mrg sync to latest -current.
 1.33.4.2  22-May-2014  yamt sync with head.

for a reference, the tree before this commit was tagged
as yamt-pagecache-tag8.

this commit was splitted into small chunks to avoid
a limitation of cvs. ("Protocol error: too many arguments")
 1.33.4.1  17-Apr-2012  yamt sync with head
 1.34.2.3  03-Dec-2017  jdolecek update from HEAD
 1.34.2.2  20-Aug-2014  tls Rebase to HEAD as of a few days ago.
 1.34.2.1  23-Jun-2013  tls resync from head
 1.35.4.1  18-May-2014  rmind sync with head
 1.36.10.1  16-Apr-2019  msaitoh Pull up following revision(s) (requested by martin in ticket #1688):
sys/kern/sys_mqueue.c: revision 1.44
mq_send1: fix argument validation and reject too large lengths early.
Discovered by Andy Nguyen.
 1.36.6.1  16-Apr-2019  msaitoh Pull up following revision(s) (requested by martin in ticket #1688):
sys/kern/sys_mqueue.c: revision 1.44
mq_send1: fix argument validation and reject too large lengths early.
Discovered by Andy Nguyen.
 1.36.4.1  16-Apr-2019  msaitoh Pull up following revision(s) (requested by martin in ticket #1688):
sys/kern/sys_mqueue.c: revision 1.44
mq_send1: fix argument validation and reject too large lengths early.
Discovered by Andy Nguyen.
 1.37.2.1  22-Sep-2015  skrll Sync with HEAD
 1.39.10.1  16-Apr-2019  msaitoh Pull up following revision(s) (requested by martin in ticket #1230):
sys/kern/sys_mqueue.c: revision 1.44
mq_send1: fix argument validation and reject too large lengths early.
Discovered by Andy Nguyen.
 1.40.4.3  13-Apr-2020  martin Mostly merge changes from HEAD upto 20200411
 1.40.4.2  08-Apr-2020  martin Merge changes from current as of 20200406
 1.40.4.1  10-Jun-2019  christos Sync with HEAD
 1.40.2.2  06-Sep-2018  pgoyette Sync with HEAD

Resolve a couple of conflicts (result of the uimin/uimax changes)
 1.40.2.1  28-Jul-2018  pgoyette Sync with HEAD
 1.48.26.1  02-Aug-2025  perseant Sync with HEAD

RSS XML Feed