summaryrefslogtreecommitdiffstats
path: root/tests/44-live-a2_order.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/44-live-a2_order.c')
-rw-r--r--tests/44-live-a2_order.c178
1 files changed, 178 insertions, 0 deletions
diff --git a/tests/44-live-a2_order.c b/tests/44-live-a2_order.c
new file mode 100644
index 0000000..4af0b89
--- /dev/null
+++ b/tests/44-live-a2_order.c
@@ -0,0 +1,178 @@
+/**
+ * Seccomp Library test program
+ *
+ * Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved.
+ * Author: Tom Hromatka <tom.hromatka@oracle.com>
+ */
+
+/*
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of version 2.1 of the GNU Lesser General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, see <http://www.gnu.org/licenses>.
+ */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <seccomp.h>
+
+#include "util.h"
+
+#define DEFAULT_ACTION_ERRNO 100
+#define DEFAULT_ACTION SCMP_ACT_ERRNO(DEFAULT_ACTION_ERRNO)
+
+struct size_and_rc {
+ int size;
+ int expected_rc;
+};
+
+static const struct size_and_rc test_cases[] = {
+ {1, 1},
+ {10, 10},
+ {50, 50},
+ {100, -DEFAULT_ACTION_ERRNO},
+ {200, -5},
+ {256, -5},
+ {257, -6},
+ {400, -6},
+ {800, -7},
+ {1600, -8},
+ {3200, -9},
+ {4095, -9},
+ {4096, -9},
+ {4097, -10},
+ {8000, -10},
+ {8192, -10},
+ {16383, -11},
+ {16384, -11},
+ {16385, -12},
+ {35000, -12},
+};
+
+static int do_read(int sz, int expected_rc)
+{
+ char *buf = NULL;
+ int rc = -1000, zero_fd = -1;
+
+ zero_fd = open("/dev/zero", O_RDONLY);
+ if (zero_fd <= 0)
+ goto error;
+
+ buf = malloc(sz);
+ if (buf == NULL)
+ goto error;
+
+ rc = read(zero_fd, buf, sz);
+ if(rc < 0) {
+ if (expected_rc == -errno)
+ rc = 0;
+ } else {
+ if (rc == expected_rc)
+ rc = 0;
+ }
+
+error:
+ if (zero_fd >= 0)
+ close(zero_fd);
+ if (buf)
+ free(buf);
+ return rc;
+}
+
+int main(int argc, char *argv[])
+{
+ int rc, i;
+ scmp_filter_ctx ctx = NULL;
+
+ ctx = seccomp_init(DEFAULT_ACTION);
+ if (ctx == NULL)
+ return ENOMEM;
+
+ rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(read), 1,
+ SCMP_A2(SCMP_CMP_LE, 64));
+ if (rc != 0)
+ goto out;
+ rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(5), SCMP_SYS(read), 1,
+ SCMP_A2(SCMP_CMP_GT, 128));
+ if (rc != 0)
+ goto out;
+ rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(6), SCMP_SYS(read), 1,
+ SCMP_A2(SCMP_CMP_GT, 256));
+ if (rc != 0)
+ goto out;
+ rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(7), SCMP_SYS(read), 1,
+ SCMP_A2(SCMP_CMP_GT, 512));
+ if (rc != 0)
+ goto out;
+ rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(8), SCMP_SYS(read), 1,
+ SCMP_A2(SCMP_CMP_GT, 1024));
+ if (rc != 0)
+ goto out;
+ rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(9), SCMP_SYS(read), 1,
+ SCMP_A2(SCMP_CMP_GT, 2048));
+ if (rc != 0)
+ goto out;
+ rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(10), SCMP_SYS(read), 1,
+ SCMP_A2(SCMP_CMP_GT, 4096));
+ if (rc != 0)
+ goto out;
+ rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(11), SCMP_SYS(read), 1,
+ SCMP_A2(SCMP_CMP_GT, 8192));
+ if (rc != 0)
+ goto out;
+ rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(12), SCMP_SYS(read), 1,
+ SCMP_A2(SCMP_CMP_GT, 16384));
+ if (rc != 0)
+ goto out;
+ rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(close), 0);
+ if (rc != 0)
+ goto out;
+ rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(rt_sigreturn), 0);
+ if (rc != 0)
+ goto out;
+ rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(exit_group), 0);
+ if (rc != 0)
+ goto out;
+ rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(exit), 0);
+ if (rc != 0)
+ goto out;
+ rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(open), 0);
+ if (rc != 0)
+ goto out;
+ rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(openat), 0);
+ if (rc != 0)
+ goto out;
+ rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(stat), 0);
+ if (rc != 0)
+ goto out;
+
+ rc = seccomp_load(ctx);
+ if (rc != 0)
+ goto out;
+
+ for (i = 0; i < sizeof(test_cases) / sizeof(test_cases[0]); i++) {
+ rc = do_read(test_cases[i].size,
+ test_cases[i].expected_rc);
+ if (rc < 0)
+ goto out;
+ }
+
+ rc = 160;
+
+out:
+ seccomp_release(ctx);
+ return (rc < 0 ? -rc : rc);
+}