bpf: lsm: Implement attach, detach and execution
[linux-2.6-microblaze.git] / kernel / bpf / syscall.c
index b2584b2..a616b63 100644 (file)
@@ -25,6 +25,7 @@
 #include <linux/nospec.h>
 #include <linux/audit.h>
 #include <uapi/linux/btf.h>
+#include <linux/bpf_lsm.h>
 
 #define IS_FD_ARRAY(map) ((map)->map_type == BPF_MAP_TYPE_PERF_EVENT_ARRAY || \
                          (map)->map_type == BPF_MAP_TYPE_CGROUP_ARRAY || \
@@ -1935,6 +1936,7 @@ bpf_prog_load_check_attach(enum bpf_prog_type prog_type,
 
                switch (prog_type) {
                case BPF_PROG_TYPE_TRACING:
+               case BPF_PROG_TYPE_LSM:
                case BPF_PROG_TYPE_STRUCT_OPS:
                case BPF_PROG_TYPE_EXT:
                        break;
@@ -2366,10 +2368,28 @@ static int bpf_tracing_prog_attach(struct bpf_prog *prog)
        struct file *link_file;
        int link_fd, err;
 
-       if (prog->expected_attach_type != BPF_TRACE_FENTRY &&
-           prog->expected_attach_type != BPF_TRACE_FEXIT &&
-           prog->expected_attach_type != BPF_MODIFY_RETURN &&
-           prog->type != BPF_PROG_TYPE_EXT) {
+       switch (prog->type) {
+       case BPF_PROG_TYPE_TRACING:
+               if (prog->expected_attach_type != BPF_TRACE_FENTRY &&
+                   prog->expected_attach_type != BPF_TRACE_FEXIT &&
+                   prog->expected_attach_type != BPF_MODIFY_RETURN) {
+                       err = -EINVAL;
+                       goto out_put_prog;
+               }
+               break;
+       case BPF_PROG_TYPE_EXT:
+               if (prog->expected_attach_type != 0) {
+                       err = -EINVAL;
+                       goto out_put_prog;
+               }
+               break;
+       case BPF_PROG_TYPE_LSM:
+               if (prog->expected_attach_type != BPF_LSM_MAC) {
+                       err = -EINVAL;
+                       goto out_put_prog;
+               }
+               break;
+       default:
                err = -EINVAL;
                goto out_put_prog;
        }
@@ -2448,16 +2468,10 @@ static int bpf_raw_tracepoint_open(const union bpf_attr *attr)
        if (IS_ERR(prog))
                return PTR_ERR(prog);
 
-       if (prog->type != BPF_PROG_TYPE_RAW_TRACEPOINT &&
-           prog->type != BPF_PROG_TYPE_TRACING &&
-           prog->type != BPF_PROG_TYPE_EXT &&
-           prog->type != BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE) {
-               err = -EINVAL;
-               goto out_put_prog;
-       }
-
-       if (prog->type == BPF_PROG_TYPE_TRACING ||
-           prog->type == BPF_PROG_TYPE_EXT) {
+       switch (prog->type) {
+       case BPF_PROG_TYPE_TRACING:
+       case BPF_PROG_TYPE_EXT:
+       case BPF_PROG_TYPE_LSM:
                if (attr->raw_tracepoint.name) {
                        /* The attach point for this category of programs
                         * should be specified via btf_id during program load.
@@ -2465,11 +2479,14 @@ static int bpf_raw_tracepoint_open(const union bpf_attr *attr)
                        err = -EINVAL;
                        goto out_put_prog;
                }
-               if (prog->expected_attach_type == BPF_TRACE_RAW_TP)
+               if (prog->type == BPF_PROG_TYPE_TRACING &&
+                   prog->expected_attach_type == BPF_TRACE_RAW_TP) {
                        tp_name = prog->aux->attach_func_name;
-               else
-                       return bpf_tracing_prog_attach(prog);
-       } else {
+                       break;
+               }
+               return bpf_tracing_prog_attach(prog);
+       case BPF_PROG_TYPE_RAW_TRACEPOINT:
+       case BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE:
                if (strncpy_from_user(buf,
                                      u64_to_user_ptr(attr->raw_tracepoint.name),
                                      sizeof(buf) - 1) < 0) {
@@ -2478,6 +2495,10 @@ static int bpf_raw_tracepoint_open(const union bpf_attr *attr)
                }
                buf[sizeof(buf) - 1] = 0;
                tp_name = buf;
+               break;
+       default:
+               err = -EINVAL;
+               goto out_put_prog;
        }
 
        btp = bpf_get_raw_tracepoint(tp_name);