Back to home page

OSCL-LXR

 
 

    


0001 {
0002     "skb->sk: no NULL check",
0003     .insns = {
0004     BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
0005     BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0),
0006     BPF_MOV64_IMM(BPF_REG_0, 0),
0007     BPF_EXIT_INSN(),
0008     },
0009     .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
0010     .result = REJECT,
0011     .errstr = "invalid mem access 'sock_common_or_null'",
0012 },
0013 {
0014     "skb->sk: sk->family [non fullsock field]",
0015     .insns = {
0016     BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
0017     BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
0018     BPF_MOV64_IMM(BPF_REG_0, 0),
0019     BPF_EXIT_INSN(),
0020     BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, offsetof(struct bpf_sock, family)),
0021     BPF_MOV64_IMM(BPF_REG_0, 0),
0022     BPF_EXIT_INSN(),
0023     },
0024     .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
0025     .result = ACCEPT,
0026 },
0027 {
0028     "skb->sk: sk->type [fullsock field]",
0029     .insns = {
0030     BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
0031     BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
0032     BPF_MOV64_IMM(BPF_REG_0, 0),
0033     BPF_EXIT_INSN(),
0034     BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, offsetof(struct bpf_sock, type)),
0035     BPF_MOV64_IMM(BPF_REG_0, 0),
0036     BPF_EXIT_INSN(),
0037     },
0038     .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
0039     .result = REJECT,
0040     .errstr = "invalid sock_common access",
0041 },
0042 {
0043     "bpf_sk_fullsock(skb->sk): no !skb->sk check",
0044     .insns = {
0045     BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
0046     BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
0047     BPF_MOV64_IMM(BPF_REG_0, 0),
0048     BPF_EXIT_INSN(),
0049     },
0050     .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
0051     .result = REJECT,
0052     .errstr = "type=sock_common_or_null expected=sock_common",
0053 },
0054 {
0055     "sk_fullsock(skb->sk): no NULL check on ret",
0056     .insns = {
0057     BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
0058     BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
0059     BPF_MOV64_IMM(BPF_REG_0, 0),
0060     BPF_EXIT_INSN(),
0061     BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
0062     BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_sock, type)),
0063     BPF_MOV64_IMM(BPF_REG_0, 0),
0064     BPF_EXIT_INSN(),
0065     },
0066     .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
0067     .result = REJECT,
0068     .errstr = "invalid mem access 'sock_or_null'",
0069 },
0070 {
0071     "sk_fullsock(skb->sk): sk->type [fullsock field]",
0072     .insns = {
0073     BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
0074     BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
0075     BPF_MOV64_IMM(BPF_REG_0, 0),
0076     BPF_EXIT_INSN(),
0077     BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
0078     BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
0079     BPF_MOV64_IMM(BPF_REG_0, 0),
0080     BPF_EXIT_INSN(),
0081     BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_sock, type)),
0082     BPF_MOV64_IMM(BPF_REG_0, 0),
0083     BPF_EXIT_INSN(),
0084     },
0085     .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
0086     .result = ACCEPT,
0087 },
0088 {
0089     "sk_fullsock(skb->sk): sk->family [non fullsock field]",
0090     .insns = {
0091     BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
0092     BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
0093     BPF_MOV64_IMM(BPF_REG_0, 0),
0094     BPF_EXIT_INSN(),
0095     BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
0096     BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
0097     BPF_EXIT_INSN(),
0098     BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_sock, family)),
0099     BPF_MOV64_IMM(BPF_REG_0, 0),
0100     BPF_EXIT_INSN(),
0101     },
0102     .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
0103     .result = ACCEPT,
0104 },
0105 {
0106     "sk_fullsock(skb->sk): sk->state [narrow load]",
0107     .insns = {
0108     BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
0109     BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
0110     BPF_MOV64_IMM(BPF_REG_0, 0),
0111     BPF_EXIT_INSN(),
0112     BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
0113     BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
0114     BPF_MOV64_IMM(BPF_REG_0, 0),
0115     BPF_EXIT_INSN(),
0116     BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_sock, state)),
0117     BPF_MOV64_IMM(BPF_REG_0, 0),
0118     BPF_EXIT_INSN(),
0119     },
0120     .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
0121     .result = ACCEPT,
0122 },
0123 {
0124     "sk_fullsock(skb->sk): sk->dst_port [word load] (backward compatibility)",
0125     .insns = {
0126     BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
0127     BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
0128     BPF_MOV64_IMM(BPF_REG_0, 0),
0129     BPF_EXIT_INSN(),
0130     BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
0131     BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
0132     BPF_MOV64_IMM(BPF_REG_0, 0),
0133     BPF_EXIT_INSN(),
0134     BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_sock, dst_port)),
0135     BPF_MOV64_IMM(BPF_REG_0, 0),
0136     BPF_EXIT_INSN(),
0137     },
0138     .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
0139     .result = ACCEPT,
0140 },
0141 {
0142     "sk_fullsock(skb->sk): sk->dst_port [half load]",
0143     .insns = {
0144     BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
0145     BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
0146     BPF_MOV64_IMM(BPF_REG_0, 0),
0147     BPF_EXIT_INSN(),
0148     BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
0149     BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
0150     BPF_MOV64_IMM(BPF_REG_0, 0),
0151     BPF_EXIT_INSN(),
0152     BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_sock, dst_port)),
0153     BPF_MOV64_IMM(BPF_REG_0, 0),
0154     BPF_EXIT_INSN(),
0155     },
0156     .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
0157     .result = ACCEPT,
0158 },
0159 {
0160     "sk_fullsock(skb->sk): sk->dst_port [half load] (invalid)",
0161     .insns = {
0162     BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
0163     BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
0164     BPF_MOV64_IMM(BPF_REG_0, 0),
0165     BPF_EXIT_INSN(),
0166     BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
0167     BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
0168     BPF_MOV64_IMM(BPF_REG_0, 0),
0169     BPF_EXIT_INSN(),
0170     BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_sock, dst_port) + 2),
0171     BPF_MOV64_IMM(BPF_REG_0, 0),
0172     BPF_EXIT_INSN(),
0173     },
0174     .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
0175     .result = REJECT,
0176     .errstr = "invalid sock access",
0177 },
0178 {
0179     "sk_fullsock(skb->sk): sk->dst_port [byte load]",
0180     .insns = {
0181     BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
0182     BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
0183     BPF_MOV64_IMM(BPF_REG_0, 0),
0184     BPF_EXIT_INSN(),
0185     BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
0186     BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
0187     BPF_MOV64_IMM(BPF_REG_0, 0),
0188     BPF_EXIT_INSN(),
0189     BPF_LDX_MEM(BPF_B, BPF_REG_2, BPF_REG_0, offsetof(struct bpf_sock, dst_port)),
0190     BPF_LDX_MEM(BPF_B, BPF_REG_2, BPF_REG_0, offsetof(struct bpf_sock, dst_port) + 1),
0191     BPF_MOV64_IMM(BPF_REG_0, 0),
0192     BPF_EXIT_INSN(),
0193     },
0194     .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
0195     .result = ACCEPT,
0196 },
0197 {
0198     "sk_fullsock(skb->sk): sk->dst_port [byte load] (invalid)",
0199     .insns = {
0200     BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
0201     BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
0202     BPF_MOV64_IMM(BPF_REG_0, 0),
0203     BPF_EXIT_INSN(),
0204     BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
0205     BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
0206     BPF_MOV64_IMM(BPF_REG_0, 0),
0207     BPF_EXIT_INSN(),
0208     BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_sock, dst_port) + 2),
0209     BPF_MOV64_IMM(BPF_REG_0, 0),
0210     BPF_EXIT_INSN(),
0211     },
0212     .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
0213     .result = REJECT,
0214     .errstr = "invalid sock access",
0215 },
0216 {
0217     "sk_fullsock(skb->sk): past sk->dst_port [half load] (invalid)",
0218     .insns = {
0219     BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
0220     BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
0221     BPF_MOV64_IMM(BPF_REG_0, 0),
0222     BPF_EXIT_INSN(),
0223     BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
0224     BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
0225     BPF_MOV64_IMM(BPF_REG_0, 0),
0226     BPF_EXIT_INSN(),
0227     BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_0, offsetofend(struct bpf_sock, dst_port)),
0228     BPF_MOV64_IMM(BPF_REG_0, 0),
0229     BPF_EXIT_INSN(),
0230     },
0231     .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
0232     .result = REJECT,
0233     .errstr = "invalid sock access",
0234 },
0235 {
0236     "sk_fullsock(skb->sk): sk->dst_ip6 [load 2nd byte]",
0237     .insns = {
0238     BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
0239     BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
0240     BPF_MOV64_IMM(BPF_REG_0, 0),
0241     BPF_EXIT_INSN(),
0242     BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
0243     BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
0244     BPF_MOV64_IMM(BPF_REG_0, 0),
0245     BPF_EXIT_INSN(),
0246     BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_sock, dst_ip6[0]) + 1),
0247     BPF_MOV64_IMM(BPF_REG_0, 0),
0248     BPF_EXIT_INSN(),
0249     },
0250     .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
0251     .result = ACCEPT,
0252 },
0253 {
0254     "sk_fullsock(skb->sk): sk->type [narrow load]",
0255     .insns = {
0256     BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
0257     BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
0258     BPF_MOV64_IMM(BPF_REG_0, 0),
0259     BPF_EXIT_INSN(),
0260     BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
0261     BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
0262     BPF_MOV64_IMM(BPF_REG_0, 0),
0263     BPF_EXIT_INSN(),
0264     BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_sock, type)),
0265     BPF_MOV64_IMM(BPF_REG_0, 0),
0266     BPF_EXIT_INSN(),
0267     },
0268     .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
0269     .result = ACCEPT,
0270 },
0271 {
0272     "sk_fullsock(skb->sk): sk->protocol [narrow load]",
0273     .insns = {
0274     BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
0275     BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
0276     BPF_MOV64_IMM(BPF_REG_0, 0),
0277     BPF_EXIT_INSN(),
0278     BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
0279     BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
0280     BPF_MOV64_IMM(BPF_REG_0, 0),
0281     BPF_EXIT_INSN(),
0282     BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_sock, protocol)),
0283     BPF_MOV64_IMM(BPF_REG_0, 0),
0284     BPF_EXIT_INSN(),
0285     },
0286     .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
0287     .result = ACCEPT,
0288 },
0289 {
0290     "sk_fullsock(skb->sk): beyond last field",
0291     .insns = {
0292     BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
0293     BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
0294     BPF_MOV64_IMM(BPF_REG_0, 0),
0295     BPF_EXIT_INSN(),
0296     BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
0297     BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
0298     BPF_MOV64_IMM(BPF_REG_0, 0),
0299     BPF_EXIT_INSN(),
0300     BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, offsetofend(struct bpf_sock, rx_queue_mapping)),
0301     BPF_MOV64_IMM(BPF_REG_0, 0),
0302     BPF_EXIT_INSN(),
0303     },
0304     .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
0305     .result = REJECT,
0306     .errstr = "invalid sock access",
0307 },
0308 {
0309     "bpf_tcp_sock(skb->sk): no !skb->sk check",
0310     .insns = {
0311     BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
0312     BPF_EMIT_CALL(BPF_FUNC_tcp_sock),
0313     BPF_MOV64_IMM(BPF_REG_0, 0),
0314     BPF_EXIT_INSN(),
0315     },
0316     .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
0317     .result = REJECT,
0318     .errstr = "type=sock_common_or_null expected=sock_common",
0319 },
0320 {
0321     "bpf_tcp_sock(skb->sk): no NULL check on ret",
0322     .insns = {
0323     BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
0324     BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
0325     BPF_MOV64_IMM(BPF_REG_0, 0),
0326     BPF_EXIT_INSN(),
0327     BPF_EMIT_CALL(BPF_FUNC_tcp_sock),
0328     BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_tcp_sock, snd_cwnd)),
0329     BPF_MOV64_IMM(BPF_REG_0, 0),
0330     BPF_EXIT_INSN(),
0331     },
0332     .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
0333     .result = REJECT,
0334     .errstr = "invalid mem access 'tcp_sock_or_null'",
0335 },
0336 {
0337     "bpf_tcp_sock(skb->sk): tp->snd_cwnd",
0338     .insns = {
0339     BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
0340     BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
0341     BPF_MOV64_IMM(BPF_REG_0, 0),
0342     BPF_EXIT_INSN(),
0343     BPF_EMIT_CALL(BPF_FUNC_tcp_sock),
0344     BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
0345     BPF_EXIT_INSN(),
0346     BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_tcp_sock, snd_cwnd)),
0347     BPF_MOV64_IMM(BPF_REG_0, 0),
0348     BPF_EXIT_INSN(),
0349     },
0350     .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
0351     .result = ACCEPT,
0352 },
0353 {
0354     "bpf_tcp_sock(skb->sk): tp->bytes_acked",
0355     .insns = {
0356     BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
0357     BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
0358     BPF_MOV64_IMM(BPF_REG_0, 0),
0359     BPF_EXIT_INSN(),
0360     BPF_EMIT_CALL(BPF_FUNC_tcp_sock),
0361     BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
0362     BPF_EXIT_INSN(),
0363     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_tcp_sock, bytes_acked)),
0364     BPF_MOV64_IMM(BPF_REG_0, 0),
0365     BPF_EXIT_INSN(),
0366     },
0367     .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
0368     .result = ACCEPT,
0369 },
0370 {
0371     "bpf_tcp_sock(skb->sk): beyond last field",
0372     .insns = {
0373     BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
0374     BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
0375     BPF_MOV64_IMM(BPF_REG_0, 0),
0376     BPF_EXIT_INSN(),
0377     BPF_EMIT_CALL(BPF_FUNC_tcp_sock),
0378     BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
0379     BPF_EXIT_INSN(),
0380     BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, offsetofend(struct bpf_tcp_sock, bytes_acked)),
0381     BPF_MOV64_IMM(BPF_REG_0, 0),
0382     BPF_EXIT_INSN(),
0383     },
0384     .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
0385     .result = REJECT,
0386     .errstr = "invalid tcp_sock access",
0387 },
0388 {
0389     "bpf_tcp_sock(bpf_sk_fullsock(skb->sk)): tp->snd_cwnd",
0390     .insns = {
0391     BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
0392     BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
0393     BPF_MOV64_IMM(BPF_REG_0, 0),
0394     BPF_EXIT_INSN(),
0395     BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
0396     BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
0397     BPF_EXIT_INSN(),
0398     BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
0399     BPF_EMIT_CALL(BPF_FUNC_tcp_sock),
0400     BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
0401     BPF_EXIT_INSN(),
0402     BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_tcp_sock, snd_cwnd)),
0403     BPF_MOV64_IMM(BPF_REG_0, 0),
0404     BPF_EXIT_INSN(),
0405     },
0406     .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
0407     .result = ACCEPT,
0408 },
0409 {
0410     "bpf_sk_release(skb->sk)",
0411     .insns = {
0412     BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
0413     BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1),
0414     BPF_EMIT_CALL(BPF_FUNC_sk_release),
0415     BPF_MOV64_IMM(BPF_REG_0, 0),
0416     BPF_EXIT_INSN(),
0417     },
0418     .prog_type = BPF_PROG_TYPE_SCHED_CLS,
0419     .result = REJECT,
0420     .errstr = "R1 must be referenced when passed to release function",
0421 },
0422 {
0423     "bpf_sk_release(bpf_sk_fullsock(skb->sk))",
0424     .insns = {
0425     BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
0426     BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
0427     BPF_MOV64_IMM(BPF_REG_0, 0),
0428     BPF_EXIT_INSN(),
0429     BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
0430     BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
0431     BPF_EXIT_INSN(),
0432     BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
0433     BPF_EMIT_CALL(BPF_FUNC_sk_release),
0434     BPF_MOV64_IMM(BPF_REG_0, 1),
0435     BPF_EXIT_INSN(),
0436     },
0437     .prog_type = BPF_PROG_TYPE_SCHED_CLS,
0438     .result = REJECT,
0439     .errstr = "R1 must be referenced when passed to release function",
0440 },
0441 {
0442     "bpf_sk_release(bpf_tcp_sock(skb->sk))",
0443     .insns = {
0444     BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
0445     BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
0446     BPF_MOV64_IMM(BPF_REG_0, 0),
0447     BPF_EXIT_INSN(),
0448     BPF_EMIT_CALL(BPF_FUNC_tcp_sock),
0449     BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
0450     BPF_EXIT_INSN(),
0451     BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
0452     BPF_EMIT_CALL(BPF_FUNC_sk_release),
0453     BPF_MOV64_IMM(BPF_REG_0, 1),
0454     BPF_EXIT_INSN(),
0455     },
0456     .prog_type = BPF_PROG_TYPE_SCHED_CLS,
0457     .result = REJECT,
0458     .errstr = "R1 must be referenced when passed to release function",
0459 },
0460 {
0461     "sk_storage_get(map, skb->sk, NULL, 0): value == NULL",
0462     .insns = {
0463     BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
0464     BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
0465     BPF_MOV64_IMM(BPF_REG_0, 0),
0466     BPF_EXIT_INSN(),
0467     BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
0468     BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
0469     BPF_MOV64_IMM(BPF_REG_0, 0),
0470     BPF_EXIT_INSN(),
0471     BPF_MOV64_IMM(BPF_REG_4, 0),
0472     BPF_MOV64_IMM(BPF_REG_3, 0),
0473     BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
0474     BPF_LD_MAP_FD(BPF_REG_1, 0),
0475     BPF_EMIT_CALL(BPF_FUNC_sk_storage_get),
0476     BPF_MOV64_IMM(BPF_REG_0, 0),
0477     BPF_EXIT_INSN(),
0478     },
0479     .fixup_sk_storage_map = { 11 },
0480     .prog_type = BPF_PROG_TYPE_SCHED_CLS,
0481     .result = ACCEPT,
0482 },
0483 {
0484     "sk_storage_get(map, skb->sk, 1, 1): value == 1",
0485     .insns = {
0486     BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
0487     BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
0488     BPF_MOV64_IMM(BPF_REG_0, 0),
0489     BPF_EXIT_INSN(),
0490     BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
0491     BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
0492     BPF_MOV64_IMM(BPF_REG_0, 0),
0493     BPF_EXIT_INSN(),
0494     BPF_MOV64_IMM(BPF_REG_4, 1),
0495     BPF_MOV64_IMM(BPF_REG_3, 1),
0496     BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
0497     BPF_LD_MAP_FD(BPF_REG_1, 0),
0498     BPF_EMIT_CALL(BPF_FUNC_sk_storage_get),
0499     BPF_MOV64_IMM(BPF_REG_0, 0),
0500     BPF_EXIT_INSN(),
0501     },
0502     .fixup_sk_storage_map = { 11 },
0503     .prog_type = BPF_PROG_TYPE_SCHED_CLS,
0504     .result = REJECT,
0505     .errstr = "R3 type=scalar expected=fp",
0506 },
0507 {
0508     "sk_storage_get(map, skb->sk, &stack_value, 1): stack_value",
0509     .insns = {
0510     BPF_MOV64_IMM(BPF_REG_2, 0),
0511     BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -8),
0512     BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
0513     BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
0514     BPF_MOV64_IMM(BPF_REG_0, 0),
0515     BPF_EXIT_INSN(),
0516     BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
0517     BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
0518     BPF_MOV64_IMM(BPF_REG_0, 0),
0519     BPF_EXIT_INSN(),
0520     BPF_MOV64_IMM(BPF_REG_4, 1),
0521     BPF_MOV64_REG(BPF_REG_3, BPF_REG_10),
0522     BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, -8),
0523     BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
0524     BPF_LD_MAP_FD(BPF_REG_1, 0),
0525     BPF_EMIT_CALL(BPF_FUNC_sk_storage_get),
0526     BPF_MOV64_IMM(BPF_REG_0, 0),
0527     BPF_EXIT_INSN(),
0528     },
0529     .fixup_sk_storage_map = { 14 },
0530     .prog_type = BPF_PROG_TYPE_SCHED_CLS,
0531     .result = ACCEPT,
0532 },
0533 {
0534     "sk_storage_get(map, skb->sk, &stack_value, 1): partially init stack_value",
0535     .insns = {
0536     BPF_MOV64_IMM(BPF_REG_2, 0),
0537     BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_2, -8),
0538     BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
0539     BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
0540     BPF_MOV64_IMM(BPF_REG_0, 0),
0541     BPF_EXIT_INSN(),
0542     BPF_EMIT_CALL(BPF_FUNC_sk_fullsock),
0543     BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
0544     BPF_MOV64_IMM(BPF_REG_0, 0),
0545     BPF_EXIT_INSN(),
0546     BPF_MOV64_IMM(BPF_REG_4, 1),
0547     BPF_MOV64_REG(BPF_REG_3, BPF_REG_10),
0548     BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, -8),
0549     BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
0550     BPF_LD_MAP_FD(BPF_REG_1, 0),
0551     BPF_EMIT_CALL(BPF_FUNC_sk_storage_get),
0552     BPF_MOV64_IMM(BPF_REG_0, 0),
0553     BPF_EXIT_INSN(),
0554     },
0555     .fixup_sk_storage_map = { 14 },
0556     .prog_type = BPF_PROG_TYPE_SCHED_CLS,
0557     .result = REJECT,
0558     .errstr = "invalid indirect read from stack",
0559 },
0560 {
0561     "bpf_map_lookup_elem(smap, &key)",
0562     .insns = {
0563     BPF_ST_MEM(BPF_W, BPF_REG_10, -4, 0),
0564     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0565     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
0566     BPF_LD_MAP_FD(BPF_REG_1, 0),
0567     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0568     BPF_MOV64_IMM(BPF_REG_0, 0),
0569     BPF_EXIT_INSN(),
0570     },
0571     .fixup_sk_storage_map = { 3 },
0572     .prog_type = BPF_PROG_TYPE_SCHED_CLS,
0573     .result = REJECT,
0574     .errstr = "cannot pass map_type 24 into func bpf_map_lookup_elem",
0575 },
0576 {
0577     "bpf_map_lookup_elem(xskmap, &key); xs->queue_id",
0578     .insns = {
0579     BPF_ST_MEM(BPF_W, BPF_REG_10, -8, 0),
0580     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0581     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0582     BPF_LD_MAP_FD(BPF_REG_1, 0),
0583     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0584     BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
0585     BPF_EXIT_INSN(),
0586     BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_xdp_sock, queue_id)),
0587     BPF_MOV64_IMM(BPF_REG_0, 0),
0588     BPF_EXIT_INSN(),
0589     },
0590     .fixup_map_xskmap = { 3 },
0591     .prog_type = BPF_PROG_TYPE_XDP,
0592     .result = ACCEPT,
0593 },
0594 {
0595     "bpf_map_lookup_elem(sockmap, &key)",
0596     .insns = {
0597     BPF_ST_MEM(BPF_W, BPF_REG_10, -4, 0),
0598     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0599     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
0600     BPF_LD_MAP_FD(BPF_REG_1, 0),
0601     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0602     BPF_MOV64_IMM(BPF_REG_0, 0),
0603     BPF_EXIT_INSN(),
0604     },
0605     .fixup_map_sockmap = { 3 },
0606     .prog_type = BPF_PROG_TYPE_SK_SKB,
0607     .result = REJECT,
0608     .errstr = "Unreleased reference id=2 alloc_insn=5",
0609 },
0610 {
0611     "bpf_map_lookup_elem(sockhash, &key)",
0612     .insns = {
0613     BPF_ST_MEM(BPF_W, BPF_REG_10, -4, 0),
0614     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0615     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
0616     BPF_LD_MAP_FD(BPF_REG_1, 0),
0617     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0618     BPF_MOV64_IMM(BPF_REG_0, 0),
0619     BPF_EXIT_INSN(),
0620     },
0621     .fixup_map_sockhash = { 3 },
0622     .prog_type = BPF_PROG_TYPE_SK_SKB,
0623     .result = REJECT,
0624     .errstr = "Unreleased reference id=2 alloc_insn=5",
0625 },
0626 {
0627     "bpf_map_lookup_elem(sockmap, &key); sk->type [fullsock field]; bpf_sk_release(sk)",
0628     .insns = {
0629     BPF_ST_MEM(BPF_W, BPF_REG_10, -4, 0),
0630     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0631     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
0632     BPF_LD_MAP_FD(BPF_REG_1, 0),
0633     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0634     BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
0635     BPF_EXIT_INSN(),
0636     BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
0637     BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_sock, type)),
0638     BPF_EMIT_CALL(BPF_FUNC_sk_release),
0639     BPF_EXIT_INSN(),
0640     },
0641     .fixup_map_sockmap = { 3 },
0642     .prog_type = BPF_PROG_TYPE_SK_SKB,
0643     .result = ACCEPT,
0644 },
0645 {
0646     "bpf_map_lookup_elem(sockhash, &key); sk->type [fullsock field]; bpf_sk_release(sk)",
0647     .insns = {
0648     BPF_ST_MEM(BPF_W, BPF_REG_10, -4, 0),
0649     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0650     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
0651     BPF_LD_MAP_FD(BPF_REG_1, 0),
0652     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0653     BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
0654     BPF_EXIT_INSN(),
0655     BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
0656     BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, offsetof(struct bpf_sock, type)),
0657     BPF_EMIT_CALL(BPF_FUNC_sk_release),
0658     BPF_EXIT_INSN(),
0659     },
0660     .fixup_map_sockhash = { 3 },
0661     .prog_type = BPF_PROG_TYPE_SK_SKB,
0662     .result = ACCEPT,
0663 },
0664 {
0665     "bpf_sk_select_reuseport(ctx, reuseport_array, &key, flags)",
0666     .insns = {
0667     BPF_MOV64_IMM(BPF_REG_4, 0),
0668     BPF_ST_MEM(BPF_W, BPF_REG_10, -4, 0),
0669     BPF_MOV64_REG(BPF_REG_3, BPF_REG_10),
0670     BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, -4),
0671     BPF_LD_MAP_FD(BPF_REG_2, 0),
0672     BPF_EMIT_CALL(BPF_FUNC_sk_select_reuseport),
0673     BPF_EXIT_INSN(),
0674     },
0675     .fixup_map_reuseport_array = { 4 },
0676     .prog_type = BPF_PROG_TYPE_SK_REUSEPORT,
0677     .result = ACCEPT,
0678 },
0679 {
0680     "bpf_sk_select_reuseport(ctx, sockmap, &key, flags)",
0681     .insns = {
0682     BPF_MOV64_IMM(BPF_REG_4, 0),
0683     BPF_ST_MEM(BPF_W, BPF_REG_10, -4, 0),
0684     BPF_MOV64_REG(BPF_REG_3, BPF_REG_10),
0685     BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, -4),
0686     BPF_LD_MAP_FD(BPF_REG_2, 0),
0687     BPF_EMIT_CALL(BPF_FUNC_sk_select_reuseport),
0688     BPF_EXIT_INSN(),
0689     },
0690     .fixup_map_sockmap = { 4 },
0691     .prog_type = BPF_PROG_TYPE_SK_REUSEPORT,
0692     .result = ACCEPT,
0693 },
0694 {
0695     "bpf_sk_select_reuseport(ctx, sockhash, &key, flags)",
0696     .insns = {
0697     BPF_MOV64_IMM(BPF_REG_4, 0),
0698     BPF_ST_MEM(BPF_W, BPF_REG_10, -4, 0),
0699     BPF_MOV64_REG(BPF_REG_3, BPF_REG_10),
0700     BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, -4),
0701     BPF_LD_MAP_FD(BPF_REG_2, 0),
0702     BPF_EMIT_CALL(BPF_FUNC_sk_select_reuseport),
0703     BPF_EXIT_INSN(),
0704     },
0705     .fixup_map_sockmap = { 4 },
0706     .prog_type = BPF_PROG_TYPE_SK_REUSEPORT,
0707     .result = ACCEPT,
0708 },
0709 {
0710     "mark null check on return value of bpf_skc_to helpers",
0711     .insns = {
0712     BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, offsetof(struct __sk_buff, sk)),
0713     BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
0714     BPF_MOV64_IMM(BPF_REG_0, 0),
0715     BPF_EXIT_INSN(),
0716     BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
0717     BPF_EMIT_CALL(BPF_FUNC_skc_to_tcp_sock),
0718     BPF_MOV64_REG(BPF_REG_7, BPF_REG_0),
0719     BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
0720     BPF_EMIT_CALL(BPF_FUNC_skc_to_tcp_request_sock),
0721     BPF_MOV64_REG(BPF_REG_8, BPF_REG_0),
0722     BPF_JMP_IMM(BPF_JNE, BPF_REG_8, 0, 2),
0723     BPF_MOV64_IMM(BPF_REG_0, 0),
0724     BPF_EXIT_INSN(),
0725     BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_7, 0),
0726     BPF_EXIT_INSN(),
0727     },
0728     .prog_type = BPF_PROG_TYPE_SCHED_CLS,
0729     .result = REJECT,
0730     .errstr = "invalid mem access",
0731     .result_unpriv = REJECT,
0732     .errstr_unpriv = "unknown func",
0733 },