123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- /* Copyright (c) 2017 Facebook
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- */
- #include <linux/bpf.h>
- #include <linux/version.h>
- #include "bpf_helpers.h"
- SEC("cgroup/dev")
- int bpf_prog1(struct bpf_cgroup_dev_ctx *ctx)
- {
- short type = ctx->access_type & 0xFFFF;
- #ifdef DEBUG
- short access = ctx->access_type >> 16;
- char fmt[] = " %d:%d \n";
- switch (type) {
- case BPF_DEVCG_DEV_BLOCK:
- fmt[0] = 'b';
- break;
- case BPF_DEVCG_DEV_CHAR:
- fmt[0] = 'c';
- break;
- default:
- fmt[0] = '?';
- break;
- }
- if (access & BPF_DEVCG_ACC_READ)
- fmt[8] = 'r';
- if (access & BPF_DEVCG_ACC_WRITE)
- fmt[9] = 'w';
- if (access & BPF_DEVCG_ACC_MKNOD)
- fmt[10] = 'm';
- bpf_trace_printk(fmt, sizeof(fmt), ctx->major, ctx->minor);
- #endif
- /* Allow access to /dev/zero and /dev/random.
- * Forbid everything else.
- */
- if (ctx->major != 1 || type != BPF_DEVCG_DEV_CHAR)
- return 0;
- switch (ctx->minor) {
- case 5: /* 1:5 /dev/zero */
- case 9: /* 1:9 /dev/urandom */
- return 1;
- }
- return 0;
- }
- char _license[] SEC("license") = "GPL";
- __u32 _version SEC("version") = LINUX_VERSION_CODE;
|