aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRicardo Branco <rbranco@suse.de>2024-05-10 14:20:16 +0000
committerWarner Losh <imp@FreeBSD.org>2024-05-10 20:50:04 +0000
commita7cc56b28fb1615a8ac4ebe826312a5d8a0f17da (patch)
tree4903a60eb578d157d802a42b08b6d53c31b70548
parent9e0164087cbf395624f63a5343357e2f6bd0370c (diff)
downloadsrc-a7cc56b28fb1615a8ac4ebe826312a5d8a0f17da.tar.gz
src-a7cc56b28fb1615a8ac4ebe826312a5d8a0f17da.zip
linux: Adjust rlimit SIGPENDING & MSGQUEUE behaviour to match linprocfs
Reviewed by: imp Pull Request: https://github.com/freebsd/freebsd-src/pull/1227
-rw-r--r--sys/compat/linux/linux_misc.c29
1 files changed, 23 insertions, 6 deletions
diff --git a/sys/compat/linux/linux_misc.c b/sys/compat/linux/linux_misc.c
index cb62b0e70c0d..9b8ab193f2bd 100644
--- a/sys/compat/linux/linux_misc.c
+++ b/sys/compat/linux/linux_misc.c
@@ -1125,16 +1125,16 @@ linux_getgroups(struct thread *td, struct linux_getgroups_args *args)
}
static bool
-linux_get_dummy_limit(l_uint resource, struct rlimit *rlim)
+linux_get_dummy_limit(struct thread *td, l_uint resource, struct rlimit *rlim)
{
+ ssize_t size;
+ int res, error;
if (linux_dummy_rlimits == 0)
return (false);
switch (resource) {
case LINUX_RLIMIT_LOCKS:
- case LINUX_RLIMIT_SIGPENDING:
- case LINUX_RLIMIT_MSGQUEUE:
case LINUX_RLIMIT_RTTIME:
rlim->rlim_cur = LINUX_RLIM_INFINITY;
rlim->rlim_max = LINUX_RLIM_INFINITY;
@@ -1144,6 +1144,23 @@ linux_get_dummy_limit(l_uint resource, struct rlimit *rlim)
rlim->rlim_cur = 0;
rlim->rlim_max = 0;
return (true);
+ case LINUX_RLIMIT_SIGPENDING:
+ error = kernel_sysctlbyname(td,
+ "kern.sigqueue.max_pending_per_proc",
+ &res, &size, 0, 0, 0, 0);
+ if (error != 0)
+ return (false);
+ rlim->rlim_cur = res;
+ rlim->rlim_max = res;
+ return (true);
+ case LINUX_RLIMIT_MSGQUEUE:
+ error = kernel_sysctlbyname(td,
+ "kern.ipc.msgmnb", &res, &size, 0, 0, 0, 0);
+ if (error != 0)
+ return (false);
+ rlim->rlim_cur = res;
+ rlim->rlim_max = res;
+ return (true);
default:
return (false);
}
@@ -1181,7 +1198,7 @@ linux_old_getrlimit(struct thread *td, struct linux_old_getrlimit_args *args)
struct rlimit bsd_rlim;
u_int which;
- if (linux_get_dummy_limit(args->resource, &bsd_rlim)) {
+ if (linux_get_dummy_limit(td, args->resource, &bsd_rlim)) {
rlim.rlim_cur = bsd_rlim.rlim_cur;
rlim.rlim_max = bsd_rlim.rlim_max;
return (copyout(&rlim, args->rlim, sizeof(rlim)));
@@ -1222,7 +1239,7 @@ linux_getrlimit(struct thread *td, struct linux_getrlimit_args *args)
struct rlimit bsd_rlim;
u_int which;
- if (linux_get_dummy_limit(args->resource, &bsd_rlim)) {
+ if (linux_get_dummy_limit(td, args->resource, &bsd_rlim)) {
rlim.rlim_cur = bsd_rlim.rlim_cur;
rlim.rlim_max = bsd_rlim.rlim_max;
return (copyout(&rlim, args->rlim, sizeof(rlim)));
@@ -2009,7 +2026,7 @@ linux_prlimit64(struct thread *td, struct linux_prlimit64_args *args)
int error;
if (args->new == NULL && args->old != NULL) {
- if (linux_get_dummy_limit(args->resource, &rlim)) {
+ if (linux_get_dummy_limit(td, args->resource, &rlim)) {
lrlim.rlim_cur = rlim.rlim_cur;
lrlim.rlim_max = rlim.rlim_max;
return (copyout(&lrlim, args->old, sizeof(lrlim)));