svn commit: r346315 - head/lib/libcasper/services/cap_fileargs
Yoshihiro Ota
ota at j.email.ne.jp
Tue Apr 23 04:07:15 UTC 2019
It looks this change is causing 'make xdev TARGET=mips TARGET_ARCH=mips' to fail as the following with HEAD checked out under "/usr/obj/freebsd":
cc -O2 -pipe -DWITH_CASPER -I/usr/obj/freebsd/contrib/elftoolchain/libelftc -
I/usr/obj/freebsd/contrib/elftoolchain/common -g -MD -MF.depend.strings.o -MTstrings.o -std=gnu99 -Qunused-arguments -c /usr/obj/freebsd/contrib/elftoolchain/strings/strings.c -o strings.o
/usr/obj/freebsd/contrib/elftoolchain/strings/strings.c:198:55: error: use of undeclared identifier 'FA_OPEN'
fa = fileargs_init(argc, argv, O_RDONLY, 0, &rights, FA_OPEN);
^
1 error generated.
*** [strings.o] Error code 1
It looks #include <casper/cap_fileargs.h> cannot pick up header files from "lib/libcasper/services/cap_fileargs"
Hiro
Ed Maste <emaste at FreeBSD.org> wrote:
> Author: emaste
> Date: Wed Apr 17 16:02:57 2019
> New Revision: 346315
> URL: https://svnweb.freebsd.org/changeset/base/346315
>
> Log:
> cap_fileargs: add fileargs_lstat service
>
> Add fileargs_lstat function to cap_fileargs casper service to be able to
> lstat files while in capability mode. It can only lstat files given in
> fileargs_init.
>
> Submitted by: Bora 〓zarslan <borako.ozarslan at gmail.com>
> Reviewed by: oshogbo, cem (partial)
> MFC after: 3 weeks
> Relnotes: Yes
> Sponsored by: The FreeBSD Foundation
> Differential Revision: https://reviews.freebsd.org/D19548
>
> Modified:
> head/lib/libcasper/services/cap_fileargs/cap_fileargs.3
> head/lib/libcasper/services/cap_fileargs/cap_fileargs.c
> head/lib/libcasper/services/cap_fileargs/cap_fileargs.h
>
> Modified: head/lib/libcasper/services/cap_fileargs/cap_fileargs.3
> ==============================================================================
> --- head/lib/libcasper/services/cap_fileargs/cap_fileargs.3 Wed Apr 17 16:00:33
> 2019 (r346314) +++ head/lib/libcasper/services/cap_fileargs/cap_fileargs.3 Wed Apr
> 17 16:02:57 2019 (r346315) @@ -24,7 +24,7 @@
> .\"
> .\" $FreeBSD$
> .\"
> -.Dd November 12, 2018
> +.Dd April 17, 2019
> .Dt CAP_FILEARGS 3
> .Os
> .Sh NAME
> @@ -33,6 +33,7 @@
> .Nm fileargs_init ,
> .Nm fileargs_initnv ,
> .Nm fileargs_free ,
> +.Nm fileargs_lstat ,
> .Nm fileargs_open ,
> .Nm fileargs_fopen
> .Nd "library for handling files in capability mode"
> @@ -43,9 +44,9 @@
> .In libcasper.h
> .In casper/cap_fileargs.h
> .Ft "fileargs_t *"
> -.Fn fileargs_init "int argc" "char *argv[]" "int flags" "mode_t mode" "cap_rights_t *rightsp"
> +.Fn fileargs_init "int argc" "char *argv[]" "int flags" "mode_t mode" "cap_rights_t *rightsp"
> "int operations" .Ft "fileargs_t *"
> -.Fn fileargs_cinit "cap_channel_t *cas" "int argc" "char *argv[]" "int flags" "mode_t mode"
> "cap_rights_t *rightsp" +.Fn fileargs_cinit "cap_channel_t *cas" "int argc" "char *argv[]" "int
> flags" "mode_t mode" "cap_rights_t *rightsp" "int operations" .Ft "fileargs_t *"
> .Fn fileargs_cinitnv "cap_channel_t *cas" "nvlist_t *limits"
> .Ft "fileargs_t *"
> @@ -53,6 +54,8 @@
> .Ft "void"
> .Fn fileargs_free "fileargs_t *fa"
> .Ft "int"
> +.Fn fileargs_lstat "fileargs_t *fa" "const char *path" "struct stat *sb"
> +.Ft "int"
> .Fn fileargs_open "fileargs_t *fa" "const char *name"
> .Ft "FILE *"
> .Fn fileargs_fopen "fileargs_t *fa" "const char *name" "const char *mode"
> @@ -97,6 +100,22 @@ The
> argument contains a list of the capability rights which file should be limited to.
> For more details of the capability rights see
> .Xr cap_rights_init 3 .
> +The
> +.Fa operations
> +argument limits the operations that are available using
> +.Nm system.fileargs .
> +.Fa operations
> +is a combination of:
> +.Bl -ohang -offset indent
> +.It FA_OPEN
> +Allow
> +.Fn fileargs_open
> +and
> +.Fn fileargs_fopen .
> +.It FA_LSTAT
> +Allow
> +.Fn fileargs_lstat .
> +.El
> .Pp
> The function
> .Fn fileargs_cinit
> @@ -126,6 +145,11 @@ The function handle
> .Dv NULL
> argument.
> .Pp
> +The function
> +.Fn fileargs_lstat
> +is equivalent to
> +.Xr lstat 2 .
> +.Pp
> The functions
> .Fn fileargs_open
> and
> @@ -165,6 +189,15 @@ must contain the
> The
> .Va mode
> argument tells which what mode file should be created.
> +.It operations (NV_TYPE_NUMBER)
> +The
> +.Va operations
> +limits the usable operations for
> +.Fa system.fileargs .
> +The possible values are explained as
> +.Va operations
> +argument with
> +.Fn fileargs_init .
> .El
> .Pp
> The
> @@ -201,7 +234,7 @@ argv += optind;
>
> /* Create capability to the system.fileargs service. */
> fa = fileargs_init(argc, argv, O_RDONLY, 0,
> - cap_rights_init(&rights, CAP_READ));
> + cap_rights_init(&rights, CAP_READ), FA_OPEN);
> if (fa == NULL)
> err(1, "unable to open system.fileargs service");
>
> @@ -222,6 +255,7 @@ fileargs_free(fa);
> .Ed
> .Sh SEE ALSO
> .Xr cap_enter 2 ,
> +.Xr lstat 2 ,
> .Xr open 2 ,
> .Xr cap_rights_init 3 ,
> .Xr err 3 ,
>
> Modified: head/lib/libcasper/services/cap_fileargs/cap_fileargs.c
> ==============================================================================
> --- head/lib/libcasper/services/cap_fileargs/cap_fileargs.c Wed Apr 17 16:00:33
> 2019 (r346314) +++ head/lib/libcasper/services/cap_fileargs/cap_fileargs.c Wed Apr
> 17 16:02:57 2019 (r346315) @@ -35,6 +35,7 @@ __FBSDID("$FreeBSD$");
> #include <sys/cnv.h>
> #include <sys/dnv.h>
> #include <sys/nv.h>
> +#include <sys/stat.h>
>
> #include <assert.h>
> #include <errno.h>
> @@ -59,8 +60,37 @@ struct fileargs {
> };
>
> static int
> -fileargs_get_cache(fileargs_t *fa, const char *name)
> +fileargs_get_lstat_cache(fileargs_t *fa, const char *name, struct stat *sb)
> {
> + const nvlist_t *nvl;
> + size_t size;
> + const void *buf;
> +
> + assert(fa != NULL);
> + assert(fa->fa_magic == FILEARGS_MAGIC);
> + assert(name != NULL);
> +
> + if (fa->fa_cache == NULL)
> + return (-1);
> +
> + nvl = dnvlist_get_nvlist(fa->fa_cache, name, NULL);
> + if (nvl == NULL)
> + return (-1);
> +
> + if (!nvlist_exists_binary(nvl, "stat")) {
> + return (-1);
> + }
> +
> + buf = nvlist_get_binary(nvl, "stat", &size);
> + assert(size == sizeof(*sb));
> + memcpy(sb, buf, size);
> +
> + return (0);
> +}
> +
> +static int
> +fileargs_get_fd_cache(fileargs_t *fa, const char *name)
> +{
> int fd;
> const nvlist_t *nvl;
> nvlist_t *tnvl;
> @@ -80,6 +110,12 @@ fileargs_get_cache(fileargs_t *fa, const char *name)
> return (-1);
>
> tnvl = nvlist_take_nvlist(fa->fa_cache, name);
> +
> + if (!nvlist_exists_descriptor(tnvl, "fd")) {
> + nvlist_destroy(tnvl);
> + return (-1);
> + }
> +
> fd = nvlist_take_descriptor(tnvl, "fd");
> nvlist_destroy(tnvl);
>
> @@ -102,7 +138,7 @@ fileargs_set_cache(fileargs_t *fa, nvlist_t *nvl)
> }
>
> static nvlist_t*
> -fileargs_fetch(fileargs_t *fa, const char *name)
> +fileargs_fetch(fileargs_t *fa, const char *name, const char *cmd)
> {
> nvlist_t *nvl;
> int serrno;
> @@ -111,7 +147,7 @@ fileargs_fetch(fileargs_t *fa, const char *name)
> assert(name != NULL);
>
> nvl = nvlist_create(NV_FLAG_NO_UNIQUE);
> - nvlist_add_string(nvl, "cmd", "open");
> + nvlist_add_string(nvl, "cmd", cmd);
> nvlist_add_string(nvl, "name", name);
>
> nvl = cap_xfer_nvlist(fa->fa_chann, nvl);
> @@ -130,7 +166,7 @@ fileargs_fetch(fileargs_t *fa, const char *name)
>
> static nvlist_t *
> fileargs_create_limit(int argc, const char * const *argv, int flags,
> - mode_t mode, cap_rights_t *rightsp)
> + mode_t mode, cap_rights_t *rightsp, int operations)
> {
> nvlist_t *limits;
> int i;
> @@ -140,6 +176,7 @@ fileargs_create_limit(int argc, const char * const *ar
> return (NULL);
>
> nvlist_add_number(limits, "flags", flags);
> + nvlist_add_number(limits, "operations", operations);
> if (rightsp != NULL) {
> nvlist_add_binary(limits, "cap_rights", rightsp,
> sizeof(*rightsp));
> @@ -172,7 +209,7 @@ fileargs_create(cap_channel_t *chan, int fdflags)
>
> fileargs_t *
> fileargs_init(int argc, char *argv[], int flags, mode_t mode,
> - cap_rights_t *rightsp)
> + cap_rights_t *rightsp, int operations)
> {
> nvlist_t *limits;
>
> @@ -181,7 +218,7 @@ fileargs_init(int argc, char *argv[], int flags, mode_
> }
>
> limits = fileargs_create_limit(argc, (const char * const *)argv, flags,
> - mode, rightsp);
> + mode, rightsp, operations);
> if (limits == NULL)
> return (NULL);
>
> @@ -190,7 +227,7 @@ fileargs_init(int argc, char *argv[], int flags, mode_
>
> fileargs_t *
> fileargs_cinit(cap_channel_t *cas, int argc, char *argv[], int flags,
> - mode_t mode, cap_rights_t *rightsp)
> + mode_t mode, cap_rights_t *rightsp, int operations)
> {
> nvlist_t *limits;
>
> @@ -199,7 +236,7 @@ fileargs_cinit(cap_channel_t *cas, int argc, char *arg
> }
>
> limits = fileargs_create_limit(argc, (const char * const *)argv, flags,
> - mode, rightsp);
> + mode, rightsp, operations);
> if (limits == NULL)
> return (NULL);
>
> @@ -234,7 +271,7 @@ fileargs_cinitnv(cap_channel_t *cas, nvlist_t *limits)
> cap_channel_t *chann;
> fileargs_t *fa;
> int serrno, ret;
> - int flags;
> + int flags, operations;
>
> assert(cas != NULL);
>
> @@ -252,6 +289,7 @@ fileargs_cinitnv(cap_channel_t *cas, nvlist_t *limits)
> }
>
> flags = nvlist_get_number(limits, "flags");
> + operations = nvlist_get_number(limits, "operations");
>
> /* Limits are consumed no need to free them. */
> ret = cap_limit_set(chann, limits);
> @@ -291,11 +329,11 @@ fileargs_open(fileargs_t *fa, const char *name)
> return (-1);
> }
>
> - fd = fileargs_get_cache(fa, name);
> + fd = fileargs_get_fd_cache(fa, name);
> if (fd != -1)
> return (fd);
>
> - nvl = fileargs_fetch(fa, name);
> + nvl = fileargs_fetch(fa, name, "open");
> if (nvl == NULL)
> return (-1);
>
> @@ -322,6 +360,53 @@ fileargs_fopen(fileargs_t *fa, const char *name, const
> return (fdopen(fd, mode));
> }
>
> +int
> +fileargs_lstat(fileargs_t *fa, const char *name, struct stat *sb)
> +{
> + nvlist_t *nvl;
> + const void *buf;
> + size_t size;
> + char *cmd;
> +
> + assert(fa != NULL);
> + assert(fa->fa_magic == FILEARGS_MAGIC);
> +
> + if (name == NULL) {
> + errno = EINVAL;
> + return (-1);
> + }
> +
> + if (sb == NULL) {
> + errno = EFAULT;
> + return (-1);
> + }
> +
> + if (fa->fa_chann == NULL) {
> + errno = ENOTCAPABLE;
> + return (-1);
> + }
> +
> + if (fileargs_get_lstat_cache(fa, name, sb) != -1)
> + return (0);
> +
> + nvl = fileargs_fetch(fa, name, "lstat");
> + if (nvl == NULL)
> + return (-1);
> +
> + buf = nvlist_get_binary(nvl, "stat", &size);
> + assert(size == sizeof(*sb));
> + memcpy(sb, buf, size);
> +
> + cmd = nvlist_take_string(nvl, "cmd");
> + if (strcmp(cmd, "cache") == 0)
> + fileargs_set_cache(fa, nvl);
> + else
> + nvlist_destroy(nvl);
> + free(cmd);
> +
> + return (0);
> +}
> +
> void
> fileargs_free(fileargs_t *fa)
> {
> @@ -348,6 +433,7 @@ static void *cacheposition;
> static bool allcached;
> static const cap_rights_t *caprightsp;
> static int capflags;
> +static int allowed_operations;
> static mode_t capmode;
>
> static int
> @@ -382,6 +468,7 @@ fileargs_add_cache(nvlist_t *nvlout, const nvlist_t *l
> void *cookie;
> nvlist_t *new;
> const char *fname;
> + struct stat sb;
>
> if ((capflags & O_CREAT) != 0) {
> allcached = true;
> @@ -409,14 +496,25 @@ fileargs_add_cache(nvlist_t *nvlout, const nvlist_t *l
> continue;
> }
>
> - fd = open_file(fname);
> - if (fd < 0) {
> - i--;
> - continue;
> + new = nvlist_create(NV_FLAG_NO_UNIQUE);
> + if ((allowed_operations & FA_OPEN) != 0) {
> + fd = open_file(fname);
> + if (fd < 0) {
> + i--;
> + nvlist_destroy(new);
> + continue;
> + }
> + nvlist_move_descriptor(new, "fd", fd);
> }
> + if ((allowed_operations & FA_LSTAT) != 0) {
> + if (lstat(fname, &sb) < 0) {
> + i--;
> + nvlist_destroy(new);
> + continue;
> + }
> + nvlist_add_binary(new, "stat", &sb, sizeof(sb));
> + }
>
> - new = nvlist_create(NV_FLAG_NO_UNIQUE);
> - nvlist_move_descriptor(new, "fd", fd);
> nvlist_add_nvlist(nvlout, fname, new);
> }
> cacheposition = cookie;
> @@ -424,10 +522,13 @@ fileargs_add_cache(nvlist_t *nvlout, const nvlist_t *l
> }
>
> static bool
> -fileargs_allowed(const nvlist_t *limits, const nvlist_t *request)
> +fileargs_allowed(const nvlist_t *limits, const nvlist_t *request, int operation)
> {
> const char *name;
>
> + if ((allowed_operations & operation) == 0)
> + return (false);
> +
> name = dnvlist_get_string(request, "name", NULL);
> if (name == NULL)
> return (false);
> @@ -450,6 +551,7 @@ fileargs_limit(const nvlist_t *oldlimits, const nvlist
> return (ENOTCAPABLE);
>
> capflags = (int)dnvlist_get_number(newlimits, "flags", 0);
> + allowed_operations = (int)dnvlist_get_number(newlimits, "operations", 0);
> if ((capflags & O_CREAT) != 0)
> capmode = (mode_t)nvlist_get_number(newlimits, "mode");
> else
> @@ -461,6 +563,37 @@ fileargs_limit(const nvlist_t *oldlimits, const nvlist
> }
>
> static int
> +fileargs_command_lstat(const nvlist_t *limits, nvlist_t *nvlin,
> + nvlist_t *nvlout)
> +{
> + int stat;
> + const char *name;
> + struct stat sb;
> +
> + if (limits == NULL)
> + return (ENOTCAPABLE);
> +
> + if (!fileargs_allowed(limits, nvlin, FA_LSTAT))
> + return (ENOTCAPABLE);
> +
> + name = nvlist_get_string(nvlin, "name");
> +
> + stat = lstat(name, &sb);
> + if (stat < 0)
> + return (errno);
> +
> + if (!allcached && (lastname == NULL ||
> + strcmp(name, lastname) == 0)) {
> + nvlist_add_string(nvlout, "cmd", "cache");
> + fileargs_add_cache(nvlout, limits, name);
> + } else {
> + nvlist_add_string(nvlout, "cmd", "lstat");
> + }
> + nvlist_add_binary(nvlout, "stat", &sb, sizeof(sb));
> + return (0);
> +}
> +
> +static int
> fileargs_command_open(const nvlist_t *limits, nvlist_t *nvlin,
> nvlist_t *nvlout)
> {
> @@ -470,7 +603,7 @@ fileargs_command_open(const nvlist_t *limits, nvlist_t
> if (limits == NULL)
> return (ENOTCAPABLE);
>
> - if (!fileargs_allowed(limits, nvlin))
> + if (!fileargs_allowed(limits, nvlin, FA_OPEN))
> return (ENOTCAPABLE);
>
> name = nvlist_get_string(nvlin, "name");
> @@ -497,6 +630,9 @@ fileargs_command(const char *cmd, const nvlist_t *limi
>
> if (strcmp(cmd, "open") == 0)
> return (fileargs_command_open(limits, nvlin, nvlout));
> +
> + if (strcmp(cmd, "lstat") == 0)
> + return (fileargs_command_lstat(limits, nvlin, nvlout));
>
> return (EINVAL);
> }
>
> Modified: head/lib/libcasper/services/cap_fileargs/cap_fileargs.h
> ==============================================================================
> --- head/lib/libcasper/services/cap_fileargs/cap_fileargs.h Wed Apr 17 16:00:33
> 2019 (r346314) +++ head/lib/libcasper/services/cap_fileargs/cap_fileargs.h Wed Apr
> 17 16:02:57 2019 (r346315) @@ -36,16 +36,21 @@
>
> #include <stdbool.h>
>
> +#define FA_OPEN 1
> +#define FA_LSTAT 2
> +
> #ifdef WITH_CASPER
> struct fileargs;
> typedef struct fileargs fileargs_t;
> +struct stat;
>
> fileargs_t *fileargs_init(int argc, char *argv[], int flags, mode_t mode,
> - cap_rights_t *rightsp);
> + cap_rights_t *rightsp, int operations);
> fileargs_t *fileargs_cinit(cap_channel_t *cas, int argc, char *argv[],
> - int flags, mode_t mode, cap_rights_t *rightsp);
> + int flags, mode_t mode, cap_rights_t *rightsp, int operations);
> fileargs_t *fileargs_initnv(nvlist_t *limits);
> fileargs_t *fileargs_cinitnv(cap_channel_t *cas, nvlist_t *limits);
> +int fileargs_lstat(fileargs_t *fa, const char *name, struct stat *sb);
> int fileargs_open(fileargs_t *fa, const char *name);
> void fileargs_free(fileargs_t *fa);
> FILE *fileargs_fopen(fileargs_t *fa, const char *name, const char *mode);
> @@ -57,7 +62,7 @@ typedef struct fileargs {
>
> static inline fileargs_t *
> fileargs_init(int argc __unused, char *argv[] __unused, int flags, mode_t mode,
> - cap_rights_t *rightsp __unused) {
> + cap_rights_t *rightsp __unused, int operations __unused) {
> fileargs_t *fa;
>
> fa = malloc(sizeof(*fa));
> @@ -71,10 +76,10 @@ fileargs_init(int argc __unused, char *argv[] __unused
>
> static inline fileargs_t *
> fileargs_cinit(cap_channel_t *cas __unused, int argc, char *argv[], int flags,
> - mode_t mode, cap_rights_t *rightsp)
> + mode_t mode, cap_rights_t *rightsp, int operations)
> {
>
> - return (fileargs_init(argc, argv, flags, mode, rightsp));
> + return (fileargs_init(argc, argv, flags, mode, rightsp, operations));
> }
>
> static inline fileargs_t *
> @@ -85,7 +90,8 @@ fileargs_initnv(nvlist_t *limits)
> fa = fileargs_init(0, NULL,
> nvlist_get_number(limits, "flags"),
> dnvlist_get_number(limits, "mode", 0),
> - NULL);
> + NULL,
> + nvlist_get_number(limits, "operations"));
> nvlist_destroy(limits);
>
> return (fa);
> @@ -98,6 +104,8 @@ fileargs_cinitnv(cap_channel_t *cas __unused, nvlist_t
> return (fileargs_initnv(limits));
> }
>
> +#define fileargs_lstat(fa, name, sb) \
> + lstat(name, sb)
> #define fileargs_open(fa, name) \
> open(name, fa->fa_flags, fa->fa_mode)
> #define fileargs_fopen(fa, name, mode) \
> _______________________________________________
> svn-src-all at freebsd.org mailing list
> https://lists.freebsd.org/mailman/listinfo/svn-src-all
> To unsubscribe, send any mail to "svn-src-all-unsubscribe at freebsd.org"
More information about the svn-src-all
mailing list