Home | History | Annotate | Download | only in bpf
      1 /* Copyright (c) 2017 Facebook
      2  *
      3  * This program is free software; you can redistribute it and/or
      4  * modify it under the terms of version 2 of the GNU General Public
      5  * License as published by the Free Software Foundation.
      6  */
      7 
      8 #include <linux/bpf.h>
      9 #include <linux/version.h>
     10 #include "bpf_helpers.h"
     11 
     12 SEC("cgroup/dev")
     13 int bpf_prog1(struct bpf_cgroup_dev_ctx *ctx)
     14 {
     15 	short type = ctx->access_type & 0xFFFF;
     16 #ifdef DEBUG
     17 	short access = ctx->access_type >> 16;
     18 	char fmt[] = "  %d:%d    \n";
     19 
     20 	switch (type) {
     21 	case BPF_DEVCG_DEV_BLOCK:
     22 		fmt[0] = 'b';
     23 		break;
     24 	case BPF_DEVCG_DEV_CHAR:
     25 		fmt[0] = 'c';
     26 		break;
     27 	default:
     28 		fmt[0] = '?';
     29 		break;
     30 	}
     31 
     32 	if (access & BPF_DEVCG_ACC_READ)
     33 		fmt[8] = 'r';
     34 
     35 	if (access & BPF_DEVCG_ACC_WRITE)
     36 		fmt[9] = 'w';
     37 
     38 	if (access & BPF_DEVCG_ACC_MKNOD)
     39 		fmt[10] = 'm';
     40 
     41 	bpf_trace_printk(fmt, sizeof(fmt), ctx->major, ctx->minor);
     42 #endif
     43 
     44 	/* Allow access to /dev/zero and /dev/random.
     45 	 * Forbid everything else.
     46 	 */
     47 	if (ctx->major != 1 || type != BPF_DEVCG_DEV_CHAR)
     48 		return 0;
     49 
     50 	switch (ctx->minor) {
     51 	case 5: /* 1:5 /dev/zero */
     52 	case 9: /* 1:9 /dev/urandom */
     53 		return 1;
     54 	}
     55 
     56 	return 0;
     57 }
     58 
     59 char _license[] SEC("license") = "GPL";
     60 __u32 _version SEC("version") = LINUX_VERSION_CODE;
     61