Index: head/sys/compat/linux/linux_misc.h =================================================================== --- head/sys/compat/linux/linux_misc.h +++ head/sys/compat/linux/linux_misc.h @@ -137,12 +137,12 @@ #define LINUX_P_PID 1 #define LINUX_P_PGID 2 -#define LINUX_RLIMIT_LOCKS RLIM_NLIMITS + 1 -#define LINUX_RLIMIT_SIGPENDING RLIM_NLIMITS + 2 -#define LINUX_RLIMIT_MSGQUEUE RLIM_NLIMITS + 3 -#define LINUX_RLIMIT_NICE RLIM_NLIMITS + 4 -#define LINUX_RLIMIT_RTPRIO RLIM_NLIMITS + 5 -#define LINUX_RLIMIT_RTTIME RLIM_NLIMITS + 6 +#define LINUX_RLIMIT_LOCKS 10 +#define LINUX_RLIMIT_SIGPENDING 11 +#define LINUX_RLIMIT_MSGQUEUE 12 +#define LINUX_RLIMIT_NICE 13 +#define LINUX_RLIMIT_RTPRIO 14 +#define LINUX_RLIMIT_RTTIME 15 #define LINUX_RLIM_INFINITY (~0UL) Index: head/sys/compat/linux/linux_misc.c =================================================================== --- head/sys/compat/linux/linux_misc.c +++ head/sys/compat/linux/linux_misc.c @@ -1373,6 +1373,28 @@ return (0); } +static bool +linux_get_dummy_limit(l_uint resource, struct rlimit *rlim) +{ + + 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; + return (true); + case LINUX_RLIMIT_NICE: + case LINUX_RLIMIT_RTPRIO: + rlim->rlim_cur = 0; + rlim->rlim_max = 0; + return (true); + default: + return (false); + } +} + int linux_setrlimit(struct thread *td, struct linux_setrlimit_args *args) { @@ -1405,6 +1427,12 @@ struct rlimit bsd_rlim; u_int which; + if (linux_get_dummy_limit(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))); + } + if (args->resource >= LINUX_RLIM_NLIMITS) return (EINVAL); @@ -1440,6 +1468,12 @@ struct rlimit bsd_rlim; u_int which; + if (linux_get_dummy_limit(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))); + } + if (args->resource >= LINUX_RLIM_NLIMITS) return (EINVAL); @@ -2137,6 +2171,14 @@ u_int which; int flags; int error; + + if (args->new == NULL && args->old != NULL) { + if (linux_get_dummy_limit(args->resource, &rlim)) { + lrlim.rlim_cur = rlim.rlim_cur; + lrlim.rlim_max = rlim.rlim_max; + return (copyout(&lrlim, args->old, sizeof(lrlim))); + } + } if (args->resource >= LINUX_RLIM_NLIMITS) return (EINVAL);