Signed-off-by: Daniel Golle <dan...@makrotopia.org>
---
To illustrate the use of the previous patch of this series.

 jail/jail.c | 76 ++++++++++++++++++++---------------------------------
 1 file changed, 29 insertions(+), 47 deletions(-)

diff --git a/jail/jail.c b/jail/jail.c
index c72de07..9d0113f 100644
--- a/jail/jail.c
+++ b/jail/jail.c
@@ -1531,6 +1531,19 @@ static int parseOCIprocessuser(struct blob_attr *msg) {
        return 0;
 }
 
+enum {
+       OCI_PROCESS_RLIMIT_TYPE,
+       OCI_PROCESS_RLIMIT_SOFT,
+       OCI_PROCESS_RLIMIT_HARD,
+       __OCI_PROCESS_RLIMIT_MAX,
+};
+
+static const struct blobmsg_policy oci_process_rlimit_policy[] = {
+       [OCI_PROCESS_RLIMIT_TYPE] = { "type", BLOBMSG_TYPE_STRING },
+       [OCI_PROCESS_RLIMIT_SOFT] = { "soft", BLOBMSG_CAST_INT64 },
+       [OCI_PROCESS_RLIMIT_HARD] = { "hard", BLOBMSG_CAST_INT64 },
+};
+
 /* from manpage GETRLIMIT(2) */
 static const char* const rlimit_names[RLIM_NLIMITS] = {
        [RLIMIT_AS] = "AS",
@@ -1566,61 +1579,30 @@ static int resolve_rlimit(char *type) {
 
 static int parseOCIrlimits(struct blob_attr *msg)
 {
-       struct blob_attr *cur, *cure;
-       int rem, reme;
+       struct blob_attr *tb[__OCI_PROCESS_RLIMIT_MAX];
        int limtype = -1;
        struct rlimit *curlim;
-       rlim_t soft, hard;
-       bool sethard = false, setsoft = false;
 
-       blobmsg_for_each_attr(cur, msg, rem) {
-               blobmsg_for_each_attr(cure, cur, reme) {
-                       if (!strcmp(blobmsg_name(cure), "type") && 
(blobmsg_type(cure) == BLOBMSG_TYPE_STRING)) {
-                               limtype = 
resolve_rlimit(blobmsg_get_string(cure));
-                       } else if (!strcmp(blobmsg_name(cure), "soft")) {
-                               switch (blobmsg_type(cure)) {
-                                       case BLOBMSG_TYPE_INT32:
-                                               soft = blobmsg_get_u32(cure);
-                                               break;
-                                       case BLOBMSG_TYPE_INT64:
-                                               soft = blobmsg_get_u64(cure);
-                                               break;
-                                       default:
-                                               return EINVAL;
-                               }
-                               setsoft = true;
-                       } else if (!strcmp(blobmsg_name(cure), "hard")) {
-                               switch (blobmsg_type(cure)) {
-                                       case BLOBMSG_TYPE_INT32:
-                                               hard = blobmsg_get_u32(cure);
-                                               break;
-                                       case BLOBMSG_TYPE_INT64:
-                                               hard = blobmsg_get_u64(cure);
-                                               break;
-                                       default:
-                                               return EINVAL;
-                               }
-                               sethard = true;
-                       } else {
-                               return EINVAL;
-                       }
-               }
+       blobmsg_parse(oci_process_rlimit_policy, __OCI_PROCESS_RLIMIT_MAX, tb, 
blobmsg_data(msg), blobmsg_len(msg));
 
-               if (limtype < 0)
-                       return EINVAL;
+       if (!tb[OCI_PROCESS_RLIMIT_TYPE] ||
+           !tb[OCI_PROCESS_RLIMIT_SOFT] ||
+           !tb[OCI_PROCESS_RLIMIT_HARD])
+               return ENODATA;
 
-               if (opts.rlimits[limtype])
-                       return ENOTUNIQ;
+       limtype = 
resolve_rlimit(blobmsg_get_string(tb[OCI_PROCESS_RLIMIT_TYPE]));
 
-               if (!sethard || !setsoft)
-                       return ENODATA;
+       if (limtype < 0)
+               return EINVAL;
+
+       if (opts.rlimits[limtype])
+               return ENOTUNIQ;
 
-               curlim = malloc(sizeof(struct rlimit));
-               curlim->rlim_cur = soft;
-               curlim->rlim_max = hard;
+       curlim = malloc(sizeof(struct rlimit));
+       curlim->rlim_cur = blobmsg_cast_u64(tb[OCI_PROCESS_RLIMIT_SOFT]);
+       curlim->rlim_max = blobmsg_cast_u64(tb[OCI_PROCESS_RLIMIT_HARD]);
 
-               opts.rlimits[limtype] = curlim;
-       }
+       opts.rlimits[limtype] = curlim;
 
        return 0;
 };
-- 
2.28.0


_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel

Reply via email to