posixshm: Add a -j option to posixshmcontrol ls, to specify a jail

PR:		257556
Reported by:	grembo@
This commit is contained in:
Jamie Gritton 2022-02-26 17:45:28 -08:00
parent 6f3c0d2764
commit be7cf3f4b8
3 changed files with 41 additions and 8 deletions

View file

@ -1,6 +1,6 @@
# $FreeBSD$
PROG= posixshmcontrol
LIBADD= util
LIBADD= jail util
.include <bsd.prog.mk>

View file

@ -27,7 +27,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd March 18, 2020
.Dd February 26, 2022
.Dt POSIXSHMCONTROL 1
.Os
.Sh NAME
@ -45,6 +45,7 @@
.Ar ls
.Op Fl h
.Op Fl n
.Op Fl j Ar jail
.Nm
.Ar dump
.Op Pa path \&...
@ -87,6 +88,11 @@ Unlink the paths specified.
.It Ic ls
List all linked named shared memory segments visible to the caller.
For each segment, the user and group owner, size, and path are displayed.
The
.Fl j
option limits the output to segments within the specified
.Ar jail
name or id.
.It Ic dump
Output raw bytes values from the segment to standard output.
.It Ic stat

View file

@ -39,6 +39,7 @@ __FBSDID("$FreeBSD$");
#include <err.h>
#include <fcntl.h>
#include <grp.h>
#include <jail.h>
#include <libutil.h>
#include <pwd.h>
#include <stdbool.h>
@ -54,7 +55,7 @@ usage(void)
fprintf(stderr, "Usage:\n"
"posixshmcontrol create [-m <mode>] [-l <largepage>] <path> ...\n"
"posixshmcontrol rm <path> ...\n"
"posixshmcontrol ls [-h] [-n]\n"
"posixshmcontrol ls [-h] [-n] [-j jail]\n"
"posixshmcontrol dump <path> ...\n"
"posixshmcontrol stat [-h] [-n] <path> ...\n"
"posixshmcontrol truncate [-s <newlen>] <path> ...\n");
@ -221,17 +222,19 @@ shm_decode_mode(mode_t m, char *str)
static int
list_shm(int argc, char **argv)
{
char *buf, *bp, sizebuf[8], str[10];
char *buf, *bp, *ep, jailpath[MAXPATHLEN], sizebuf[8], str[10];
const char *jailparam;
const struct kinfo_file *kif;
struct stat st;
int c, error, fd, mib[3], ret;
size_t len, miblen;
bool hsize, uname;
int c, error, fd, jid, mib[3], ret;
size_t len, jailpathlen, miblen;
bool hsize, jailed, uname;
hsize = false;
jailed = false;
uname = true;
while ((c = getopt(argc, argv, "hn")) != -1) {
while ((c = getopt(argc, argv, "hj:n")) != -1) {
switch (c) {
case 'h':
hsize = true;
@ -239,6 +242,28 @@ list_shm(int argc, char **argv)
case 'n':
uname = false;
break;
case 'j':
jid = strtoul(optarg, &ep, 10);
if (ep > optarg && !*ep) {
jailparam = "jid";
jailed = jid > 0;
} else {
jailparam = "name";
jailed = true;
}
if (jailed) {
if (jail_getv(0, jailparam, optarg, "path",
jailpath, NULL) < 0) {
if (errno == ENOENT)
warnx("no such jail: %s", optarg);
else
warnx("%s", jail_errmsg);
return (1);
}
jailpathlen = strlen(jailpath);
jailpath[jailpathlen] = '/';
}
break;
default:
usage();
return (2);
@ -279,6 +304,8 @@ list_shm(int argc, char **argv)
kif = (const struct kinfo_file *)(void *)bp;
if (kif->kf_structsize == 0)
break;
if (jailed && strncmp(kif->kf_path, jailpath, jailpathlen + 1))
continue;
fd = shm_open(kif->kf_path, O_RDONLY, 0);
if (fd == -1) {
warn("open %s", kif->kf_path);