filter.c 29.7 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3
/*
 * Linux Socket Filter - Kernel level socket filtering
 *
4 5
 * Based on the design of the Berkeley Packet Filter. The new
 * internal format has been designed by PLUMgrid:
L
Linus Torvalds 已提交
6
 *
7 8 9 10 11 12 13
 *	Copyright (c) 2011 - 2014 PLUMgrid, http://plumgrid.com
 *
 * Authors:
 *
 *	Jay Schulist <jschlst@samba.org>
 *	Alexei Starovoitov <ast@plumgrid.com>
 *	Daniel Borkmann <dborkman@redhat.com>
L
Linus Torvalds 已提交
14 15 16 17 18 19 20
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version
 * 2 of the License, or (at your option) any later version.
 *
 * Andi Kleen - Fix a few bad bugs and races.
21
 * Kris Katterjohn - Added many additional checks in bpf_check_classic()
L
Linus Torvalds 已提交
22 23 24 25 26 27 28 29 30 31 32
 */

#include <linux/module.h>
#include <linux/types.h>
#include <linux/mm.h>
#include <linux/fcntl.h>
#include <linux/socket.h>
#include <linux/in.h>
#include <linux/inet.h>
#include <linux/netdevice.h>
#include <linux/if_packet.h>
33
#include <linux/gfp.h>
L
Linus Torvalds 已提交
34 35
#include <net/ip.h>
#include <net/protocol.h>
36
#include <net/netlink.h>
L
Linus Torvalds 已提交
37 38 39 40 41
#include <linux/skbuff.h>
#include <net/sock.h>
#include <linux/errno.h>
#include <linux/timer.h>
#include <asm/uaccess.h>
42
#include <asm/unaligned.h>
L
Linus Torvalds 已提交
43
#include <linux/filter.h>
44
#include <linux/ratelimit.h>
45
#include <linux/seccomp.h>
E
Eric Dumazet 已提交
46
#include <linux/if_vlan.h>
L
Linus Torvalds 已提交
47

S
Stephen Hemminger 已提交
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
/**
 *	sk_filter - run a packet through a socket filter
 *	@sk: sock associated with &sk_buff
 *	@skb: buffer to filter
 *
 * Run the filter code and then cut skb->data to correct size returned by
 * sk_run_filter. If pkt_len is 0 we toss packet. If skb->len is smaller
 * than pkt_len we keep whole skb->data. This is the socket level
 * wrapper to sk_run_filter. It returns 0 if the packet should
 * be accepted or -EPERM if the packet should be tossed.
 *
 */
int sk_filter(struct sock *sk, struct sk_buff *skb)
{
	int err;
	struct sk_filter *filter;

65 66 67 68 69 70 71 72
	/*
	 * If the skb was allocated from pfmemalloc reserves, only
	 * allow SOCK_MEMALLOC sockets to use it as this socket is
	 * helping free memory
	 */
	if (skb_pfmemalloc(skb) && !sock_flag(sk, SOCK_MEMALLOC))
		return -ENOMEM;

S
Stephen Hemminger 已提交
73 74 75 76
	err = security_sock_rcv_skb(sk, skb);
	if (err)
		return err;

77 78
	rcu_read_lock();
	filter = rcu_dereference(sk->sk_filter);
S
Stephen Hemminger 已提交
79
	if (filter) {
80
		unsigned int pkt_len = SK_RUN_FILTER(filter, skb);
81

S
Stephen Hemminger 已提交
82 83
		err = pkt_len ? pskb_trim(skb, pkt_len) : -EPERM;
	}
84
	rcu_read_unlock();
S
Stephen Hemminger 已提交
85 86 87 88 89

	return err;
}
EXPORT_SYMBOL(sk_filter);

90
static u64 __skb_get_pay_offset(u64 ctx, u64 a, u64 x, u64 r4, u64 r5)
91
{
92
	return skb_get_poff((struct sk_buff *)(unsigned long) ctx);
93 94
}

95
static u64 __skb_get_nlattr(u64 ctx, u64 a, u64 x, u64 r4, u64 r5)
96
{
97
	struct sk_buff *skb = (struct sk_buff *)(unsigned long) ctx;
98 99 100 101 102
	struct nlattr *nla;

	if (skb_is_nonlinear(skb))
		return 0;

103 104 105
	if (skb->len < sizeof(struct nlattr))
		return 0;

106
	if (a > skb->len - sizeof(struct nlattr))
107 108
		return 0;

109
	nla = nla_find((struct nlattr *) &skb->data[a], skb->len - a, x);
110 111 112 113 114 115
	if (nla)
		return (void *) nla - (void *) skb->data;

	return 0;
}

116
static u64 __skb_get_nlattr_nest(u64 ctx, u64 a, u64 x, u64 r4, u64 r5)
117
{
118
	struct sk_buff *skb = (struct sk_buff *)(unsigned long) ctx;
119 120 121 122 123
	struct nlattr *nla;

	if (skb_is_nonlinear(skb))
		return 0;

124 125 126
	if (skb->len < sizeof(struct nlattr))
		return 0;

127
	if (a > skb->len - sizeof(struct nlattr))
128 129
		return 0;

130 131
	nla = (struct nlattr *) &skb->data[a];
	if (nla->nla_len > skb->len - a)
132 133
		return 0;

134
	nla = nla_find_nested(nla, x);
135 136 137 138 139 140
	if (nla)
		return (void *) nla - (void *) skb->data;

	return 0;
}

141
static u64 __get_raw_cpu_id(u64 ctx, u64 a, u64 x, u64 r4, u64 r5)
142 143 144 145
{
	return raw_smp_processor_id();
}

C
Chema Gonzalez 已提交
146
/* note that this only generates 32-bit random numbers */
147
static u64 __get_random_u32(u64 ctx, u64 a, u64 x, u64 r4, u64 r5)
C
Chema Gonzalez 已提交
148
{
149
	return prandom_u32();
C
Chema Gonzalez 已提交
150 151
}

152
static bool convert_bpf_extensions(struct sock_filter *fp,
153
				   struct bpf_insn **insnp)
154
{
155
	struct bpf_insn *insn = *insnp;
156 157 158 159 160

	switch (fp->k) {
	case SKF_AD_OFF + SKF_AD_PROTOCOL:
		BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, protocol) != 2);

161
		/* A = *(u16 *) (CTX + offsetof(protocol)) */
162 163
		*insn++ = BPF_LDX_MEM(BPF_H, BPF_REG_A, BPF_REG_CTX,
				      offsetof(struct sk_buff, protocol));
164
		/* A = ntohs(A) [emitting a nop or swap16] */
165
		*insn = BPF_ENDIAN(BPF_FROM_BE, BPF_REG_A, 16);
166 167 168
		break;

	case SKF_AD_OFF + SKF_AD_PKTTYPE:
169 170
		*insn++ = BPF_LDX_MEM(BPF_B, BPF_REG_A, BPF_REG_CTX,
				      PKT_TYPE_OFFSET());
171
		*insn = BPF_ALU32_IMM(BPF_AND, BPF_REG_A, PKT_TYPE_MAX);
172 173
#ifdef __BIG_ENDIAN_BITFIELD
		insn++;
174
                *insn = BPF_ALU32_IMM(BPF_RSH, BPF_REG_A, 5);
175
#endif
176 177 178 179 180 181
		break;

	case SKF_AD_OFF + SKF_AD_IFINDEX:
	case SKF_AD_OFF + SKF_AD_HATYPE:
		BUILD_BUG_ON(FIELD_SIZEOF(struct net_device, ifindex) != 4);
		BUILD_BUG_ON(FIELD_SIZEOF(struct net_device, type) != 2);
182 183 184 185 186 187 188 189 190 191 192 193 194 195
		BUILD_BUG_ON(bytes_to_bpf_size(FIELD_SIZEOF(struct sk_buff, dev)) < 0);

		*insn++ = BPF_LDX_MEM(bytes_to_bpf_size(FIELD_SIZEOF(struct sk_buff, dev)),
				      BPF_REG_TMP, BPF_REG_CTX,
				      offsetof(struct sk_buff, dev));
		/* if (tmp != 0) goto pc + 1 */
		*insn++ = BPF_JMP_IMM(BPF_JNE, BPF_REG_TMP, 0, 1);
		*insn++ = BPF_EXIT_INSN();
		if (fp->k == SKF_AD_OFF + SKF_AD_IFINDEX)
			*insn = BPF_LDX_MEM(BPF_W, BPF_REG_A, BPF_REG_TMP,
					    offsetof(struct net_device, ifindex));
		else
			*insn = BPF_LDX_MEM(BPF_H, BPF_REG_A, BPF_REG_TMP,
					    offsetof(struct net_device, type));
196 197 198 199 200
		break;

	case SKF_AD_OFF + SKF_AD_MARK:
		BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, mark) != 4);

201 202
		*insn = BPF_LDX_MEM(BPF_W, BPF_REG_A, BPF_REG_CTX,
				    offsetof(struct sk_buff, mark));
203 204 205 206 207
		break;

	case SKF_AD_OFF + SKF_AD_RXHASH:
		BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, hash) != 4);

208 209
		*insn = BPF_LDX_MEM(BPF_W, BPF_REG_A, BPF_REG_CTX,
				    offsetof(struct sk_buff, hash));
210 211 212 213 214
		break;

	case SKF_AD_OFF + SKF_AD_QUEUE:
		BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, queue_mapping) != 2);

215 216
		*insn = BPF_LDX_MEM(BPF_H, BPF_REG_A, BPF_REG_CTX,
				    offsetof(struct sk_buff, queue_mapping));
217 218 219 220 221 222 223
		break;

	case SKF_AD_OFF + SKF_AD_VLAN_TAG:
	case SKF_AD_OFF + SKF_AD_VLAN_TAG_PRESENT:
		BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, vlan_tci) != 2);
		BUILD_BUG_ON(VLAN_TAG_PRESENT != 0x1000);

224
		/* A = *(u16 *) (CTX + offsetof(vlan_tci)) */
225 226
		*insn++ = BPF_LDX_MEM(BPF_H, BPF_REG_A, BPF_REG_CTX,
				      offsetof(struct sk_buff, vlan_tci));
227
		if (fp->k == SKF_AD_OFF + SKF_AD_VLAN_TAG) {
228 229
			*insn = BPF_ALU32_IMM(BPF_AND, BPF_REG_A,
					      ~VLAN_TAG_PRESENT);
230
		} else {
231
			/* A >>= 12 */
232
			*insn++ = BPF_ALU32_IMM(BPF_RSH, BPF_REG_A, 12);
233 234
			/* A &= 1 */
			*insn = BPF_ALU32_IMM(BPF_AND, BPF_REG_A, 1);
235 236 237 238 239 240 241
		}
		break;

	case SKF_AD_OFF + SKF_AD_PAY_OFFSET:
	case SKF_AD_OFF + SKF_AD_NLATTR:
	case SKF_AD_OFF + SKF_AD_NLATTR_NEST:
	case SKF_AD_OFF + SKF_AD_CPU:
C
Chema Gonzalez 已提交
242
	case SKF_AD_OFF + SKF_AD_RANDOM:
243
		/* arg1 = CTX */
244
		*insn++ = BPF_MOV64_REG(BPF_REG_ARG1, BPF_REG_CTX);
245
		/* arg2 = A */
246
		*insn++ = BPF_MOV64_REG(BPF_REG_ARG2, BPF_REG_A);
247
		/* arg3 = X */
248
		*insn++ = BPF_MOV64_REG(BPF_REG_ARG3, BPF_REG_X);
249
		/* Emit call(arg1=CTX, arg2=A, arg3=X) */
250 251
		switch (fp->k) {
		case SKF_AD_OFF + SKF_AD_PAY_OFFSET:
252
			*insn = BPF_EMIT_CALL(__skb_get_pay_offset);
253 254
			break;
		case SKF_AD_OFF + SKF_AD_NLATTR:
255
			*insn = BPF_EMIT_CALL(__skb_get_nlattr);
256 257
			break;
		case SKF_AD_OFF + SKF_AD_NLATTR_NEST:
258
			*insn = BPF_EMIT_CALL(__skb_get_nlattr_nest);
259 260
			break;
		case SKF_AD_OFF + SKF_AD_CPU:
261
			*insn = BPF_EMIT_CALL(__get_raw_cpu_id);
262
			break;
C
Chema Gonzalez 已提交
263
		case SKF_AD_OFF + SKF_AD_RANDOM:
264
			*insn = BPF_EMIT_CALL(__get_random_u32);
C
Chema Gonzalez 已提交
265
			break;
266 267 268 269
		}
		break;

	case SKF_AD_OFF + SKF_AD_ALU_XOR_X:
270 271
		/* A ^= X */
		*insn = BPF_ALU32_REG(BPF_XOR, BPF_REG_A, BPF_REG_X);
272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287
		break;

	default:
		/* This is just a dummy call to avoid letting the compiler
		 * evict __bpf_call_base() as an optimization. Placed here
		 * where no-one bothers.
		 */
		BUG_ON(__bpf_call_base(0, 0, 0, 0, 0) != 0);
		return false;
	}

	*insnp = insn;
	return true;
}

/**
288
 *	bpf_convert_filter - convert filter program
289 290 291 292 293 294 295 296 297
 *	@prog: the user passed filter program
 *	@len: the length of the user passed filter program
 *	@new_prog: buffer where converted program will be stored
 *	@new_len: pointer to store length of converted program
 *
 * Remap 'sock_filter' style BPF instruction set to 'sock_filter_ext' style.
 * Conversion workflow:
 *
 * 1) First pass for calculating the new program length:
298
 *   bpf_convert_filter(old_prog, old_len, NULL, &new_len)
299 300 301
 *
 * 2) 2nd pass to remap in two passes: 1st pass finds new
 *    jump offsets, 2nd pass remapping:
302
 *   new_prog = kmalloc(sizeof(struct bpf_insn) * new_len);
303
 *   bpf_convert_filter(old_prog, old_len, new_prog, &new_len);
304 305 306 307 308 309 310
 *
 * User BPF's register A is mapped to our BPF register 6, user BPF
 * register X is mapped to BPF register 7; frame pointer is always
 * register 10; Context 'void *ctx' is stored in register 1, that is,
 * for socket filters: ctx == 'struct sk_buff *', for seccomp:
 * ctx == 'struct seccomp_data *'.
 */
311 312
int bpf_convert_filter(struct sock_filter *prog, int len,
		       struct bpf_insn *new_prog, int *new_len)
313 314
{
	int new_flen = 0, pass = 0, target, i;
315
	struct bpf_insn *new_insn;
316 317 318 319 320
	struct sock_filter *fp;
	int *addrs = NULL;
	u8 bpf_src;

	BUILD_BUG_ON(BPF_MEMWORDS * sizeof(u32) > MAX_BPF_STACK);
321
	BUILD_BUG_ON(BPF_REG_FP + 1 != MAX_BPF_REG);
322

323
	if (len <= 0 || len > BPF_MAXINSNS)
324 325 326
		return -EINVAL;

	if (new_prog) {
327
		addrs = kcalloc(len, sizeof(*addrs), GFP_KERNEL);
328 329 330 331 332 333 334 335
		if (!addrs)
			return -ENOMEM;
	}

do_pass:
	new_insn = new_prog;
	fp = prog;

336 337
	if (new_insn)
		*new_insn = BPF_MOV64_REG(BPF_REG_CTX, BPF_REG_ARG1);
338 339 340
	new_insn++;

	for (i = 0; i < len; fp++, i++) {
341 342
		struct bpf_insn tmp_insns[6] = { };
		struct bpf_insn *insn = tmp_insns;
343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384

		if (addrs)
			addrs[i] = new_insn - new_prog;

		switch (fp->code) {
		/* All arithmetic insns and skb loads map as-is. */
		case BPF_ALU | BPF_ADD | BPF_X:
		case BPF_ALU | BPF_ADD | BPF_K:
		case BPF_ALU | BPF_SUB | BPF_X:
		case BPF_ALU | BPF_SUB | BPF_K:
		case BPF_ALU | BPF_AND | BPF_X:
		case BPF_ALU | BPF_AND | BPF_K:
		case BPF_ALU | BPF_OR | BPF_X:
		case BPF_ALU | BPF_OR | BPF_K:
		case BPF_ALU | BPF_LSH | BPF_X:
		case BPF_ALU | BPF_LSH | BPF_K:
		case BPF_ALU | BPF_RSH | BPF_X:
		case BPF_ALU | BPF_RSH | BPF_K:
		case BPF_ALU | BPF_XOR | BPF_X:
		case BPF_ALU | BPF_XOR | BPF_K:
		case BPF_ALU | BPF_MUL | BPF_X:
		case BPF_ALU | BPF_MUL | BPF_K:
		case BPF_ALU | BPF_DIV | BPF_X:
		case BPF_ALU | BPF_DIV | BPF_K:
		case BPF_ALU | BPF_MOD | BPF_X:
		case BPF_ALU | BPF_MOD | BPF_K:
		case BPF_ALU | BPF_NEG:
		case BPF_LD | BPF_ABS | BPF_W:
		case BPF_LD | BPF_ABS | BPF_H:
		case BPF_LD | BPF_ABS | BPF_B:
		case BPF_LD | BPF_IND | BPF_W:
		case BPF_LD | BPF_IND | BPF_H:
		case BPF_LD | BPF_IND | BPF_B:
			/* Check for overloaded BPF extension and
			 * directly convert it if found, otherwise
			 * just move on with mapping.
			 */
			if (BPF_CLASS(fp->code) == BPF_LD &&
			    BPF_MODE(fp->code) == BPF_ABS &&
			    convert_bpf_extensions(fp, &insn))
				break;

385
			*insn = BPF_RAW_INSN(fp->code, BPF_REG_A, BPF_REG_X, 0, fp->k);
386 387
			break;

388 389 390 391 392 393 394
		/* Jump transformation cannot use BPF block macros
		 * everywhere as offset calculation and target updates
		 * require a bit more work than the rest, i.e. jump
		 * opcodes map as-is, but offsets need adjustment.
		 */

#define BPF_EMIT_JMP							\
395 396 397 398 399 400 401 402
	do {								\
		if (target >= len || target < 0)			\
			goto err;					\
		insn->off = addrs ? addrs[target] - addrs[i] - 1 : 0;	\
		/* Adjust pc relative offset for 2nd or 3rd insn. */	\
		insn->off -= insn - tmp_insns;				\
	} while (0)

403 404 405 406
		case BPF_JMP | BPF_JA:
			target = i + fp->k + 1;
			insn->code = fp->code;
			BPF_EMIT_JMP;
407 408 409 410 411 412 413 414 415 416 417 418 419 420 421
			break;

		case BPF_JMP | BPF_JEQ | BPF_K:
		case BPF_JMP | BPF_JEQ | BPF_X:
		case BPF_JMP | BPF_JSET | BPF_K:
		case BPF_JMP | BPF_JSET | BPF_X:
		case BPF_JMP | BPF_JGT | BPF_K:
		case BPF_JMP | BPF_JGT | BPF_X:
		case BPF_JMP | BPF_JGE | BPF_K:
		case BPF_JMP | BPF_JGE | BPF_X:
			if (BPF_SRC(fp->code) == BPF_K && (int) fp->k < 0) {
				/* BPF immediates are signed, zero extend
				 * immediate into tmp register and use it
				 * in compare insn.
				 */
422
				*insn++ = BPF_MOV32_IMM(BPF_REG_TMP, fp->k);
423

424 425
				insn->dst_reg = BPF_REG_A;
				insn->src_reg = BPF_REG_TMP;
426 427
				bpf_src = BPF_X;
			} else {
428 429
				insn->dst_reg = BPF_REG_A;
				insn->src_reg = BPF_REG_X;
430 431
				insn->imm = fp->k;
				bpf_src = BPF_SRC(fp->code);
L
Linus Torvalds 已提交
432
			}
433 434 435 436 437

			/* Common case where 'jump_false' is next insn. */
			if (fp->jf == 0) {
				insn->code = BPF_JMP | BPF_OP(fp->code) | bpf_src;
				target = i + fp->jt + 1;
438
				BPF_EMIT_JMP;
439
				break;
L
Linus Torvalds 已提交
440
			}
441 442 443 444 445

			/* Convert JEQ into JNE when 'jump_true' is next insn. */
			if (fp->jt == 0 && BPF_OP(fp->code) == BPF_JEQ) {
				insn->code = BPF_JMP | BPF_JNE | bpf_src;
				target = i + fp->jf + 1;
446
				BPF_EMIT_JMP;
447
				break;
448
			}
449 450 451 452

			/* Other jumps are mapped into two insns: Jxx and JA. */
			target = i + fp->jt + 1;
			insn->code = BPF_JMP | BPF_OP(fp->code) | bpf_src;
453
			BPF_EMIT_JMP;
454 455 456 457
			insn++;

			insn->code = BPF_JMP | BPF_JA;
			target = i + fp->jf + 1;
458
			BPF_EMIT_JMP;
459 460 461 462
			break;

		/* ldxb 4 * ([14] & 0xf) is remaped into 6 insns. */
		case BPF_LDX | BPF_MSH | BPF_B:
463
			/* tmp = A */
464
			*insn++ = BPF_MOV64_REG(BPF_REG_TMP, BPF_REG_A);
465
			/* A = BPF_R0 = *(u8 *) (skb->data + K) */
466
			*insn++ = BPF_LD_ABS(BPF_B, fp->k);
467
			/* A &= 0xf */
468
			*insn++ = BPF_ALU32_IMM(BPF_AND, BPF_REG_A, 0xf);
469
			/* A <<= 2 */
470
			*insn++ = BPF_ALU32_IMM(BPF_LSH, BPF_REG_A, 2);
471
			/* X = A */
472
			*insn++ = BPF_MOV64_REG(BPF_REG_X, BPF_REG_A);
473
			/* A = tmp */
474
			*insn = BPF_MOV64_REG(BPF_REG_A, BPF_REG_TMP);
475 476 477 478 479
			break;

		/* RET_K, RET_A are remaped into 2 insns. */
		case BPF_RET | BPF_A:
		case BPF_RET | BPF_K:
480 481 482
			*insn++ = BPF_MOV32_RAW(BPF_RVAL(fp->code) == BPF_K ?
						BPF_K : BPF_X, BPF_REG_0,
						BPF_REG_A, fp->k);
483
			*insn = BPF_EXIT_INSN();
484 485 486 487 488
			break;

		/* Store to stack. */
		case BPF_ST:
		case BPF_STX:
489 490 491
			*insn = BPF_STX_MEM(BPF_W, BPF_REG_FP, BPF_CLASS(fp->code) ==
					    BPF_ST ? BPF_REG_A : BPF_REG_X,
					    -(BPF_MEMWORDS - fp->k) * 4);
492 493 494 495 496
			break;

		/* Load from stack. */
		case BPF_LD | BPF_MEM:
		case BPF_LDX | BPF_MEM:
497 498 499
			*insn = BPF_LDX_MEM(BPF_W, BPF_CLASS(fp->code) == BPF_LD  ?
					    BPF_REG_A : BPF_REG_X, BPF_REG_FP,
					    -(BPF_MEMWORDS - fp->k) * 4);
500 501 502 503 504
			break;

		/* A = K or X = K */
		case BPF_LD | BPF_IMM:
		case BPF_LDX | BPF_IMM:
505 506
			*insn = BPF_MOV32_IMM(BPF_CLASS(fp->code) == BPF_LD ?
					      BPF_REG_A : BPF_REG_X, fp->k);
507 508 509 510
			break;

		/* X = A */
		case BPF_MISC | BPF_TAX:
511
			*insn = BPF_MOV64_REG(BPF_REG_X, BPF_REG_A);
512 513 514 515
			break;

		/* A = X */
		case BPF_MISC | BPF_TXA:
516
			*insn = BPF_MOV64_REG(BPF_REG_A, BPF_REG_X);
517 518 519 520 521
			break;

		/* A = skb->len or X = skb->len */
		case BPF_LD | BPF_W | BPF_LEN:
		case BPF_LDX | BPF_W | BPF_LEN:
522 523 524
			*insn = BPF_LDX_MEM(BPF_W, BPF_CLASS(fp->code) == BPF_LD ?
					    BPF_REG_A : BPF_REG_X, BPF_REG_CTX,
					    offsetof(struct sk_buff, len));
525 526
			break;

527
		/* Access seccomp_data fields. */
528
		case BPF_LDX | BPF_ABS | BPF_W:
529 530
			/* A = *(u32 *) (ctx + K) */
			*insn = BPF_LDX_MEM(BPF_W, BPF_REG_A, BPF_REG_CTX, fp->k);
531 532
			break;

533
		/* Unkown instruction. */
L
Linus Torvalds 已提交
534
		default:
535
			goto err;
L
Linus Torvalds 已提交
536
		}
537 538 539 540 541 542

		insn++;
		if (new_prog)
			memcpy(new_insn, tmp_insns,
			       sizeof(*insn) * (insn - tmp_insns));
		new_insn += insn - tmp_insns;
L
Linus Torvalds 已提交
543 544
	}

545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560
	if (!new_prog) {
		/* Only calculating new length. */
		*new_len = new_insn - new_prog;
		return 0;
	}

	pass++;
	if (new_flen != new_insn - new_prog) {
		new_flen = new_insn - new_prog;
		if (pass > 2)
			goto err;
		goto do_pass;
	}

	kfree(addrs);
	BUG_ON(*new_len != new_flen);
L
Linus Torvalds 已提交
561
	return 0;
562 563 564
err:
	kfree(addrs);
	return -EINVAL;
L
Linus Torvalds 已提交
565 566
}

567 568
/* Security:
 *
569
 * A BPF program is able to use 16 cells of memory to store intermediate
570 571
 * values (check u32 mem[BPF_MEMWORDS] in sk_run_filter()).
 *
572 573 574
 * As we dont want to clear mem[] array for each packet going through
 * sk_run_filter(), we check that filter loaded by user never try to read
 * a cell if not previously written, and we check all branches to be sure
L
Lucas De Marchi 已提交
575
 * a malicious user doesn't try to abuse us.
576
 */
577
static int check_load_and_stores(const struct sock_filter *filter, int flen)
578
{
579
	u16 *masks, memvalid = 0; /* One bit per cell, 16 cells */
580 581 582
	int pc, ret = 0;

	BUILD_BUG_ON(BPF_MEMWORDS > 16);
583

584
	masks = kmalloc_array(flen, sizeof(*masks), GFP_KERNEL);
585 586
	if (!masks)
		return -ENOMEM;
587

588 589 590 591 592 593
	memset(masks, 0xff, flen * sizeof(*masks));

	for (pc = 0; pc < flen; pc++) {
		memvalid &= masks[pc];

		switch (filter[pc].code) {
594 595
		case BPF_ST:
		case BPF_STX:
596 597
			memvalid |= (1 << filter[pc].k);
			break;
598 599
		case BPF_LD | BPF_MEM:
		case BPF_LDX | BPF_MEM:
600 601 602 603 604
			if (!(memvalid & (1 << filter[pc].k))) {
				ret = -EINVAL;
				goto error;
			}
			break;
605 606
		case BPF_JMP | BPF_JA:
			/* A jump must set masks on target */
607 608 609
			masks[pc + 1 + filter[pc].k] &= memvalid;
			memvalid = ~0;
			break;
610 611 612 613 614 615 616 617 618
		case BPF_JMP | BPF_JEQ | BPF_K:
		case BPF_JMP | BPF_JEQ | BPF_X:
		case BPF_JMP | BPF_JGE | BPF_K:
		case BPF_JMP | BPF_JGE | BPF_X:
		case BPF_JMP | BPF_JGT | BPF_K:
		case BPF_JMP | BPF_JGT | BPF_X:
		case BPF_JMP | BPF_JSET | BPF_K:
		case BPF_JMP | BPF_JSET | BPF_X:
			/* A jump must set masks on targets */
619 620 621 622 623 624 625 626 627 628 629
			masks[pc + 1 + filter[pc].jt] &= memvalid;
			masks[pc + 1 + filter[pc].jf] &= memvalid;
			memvalid = ~0;
			break;
		}
	}
error:
	kfree(masks);
	return ret;
}

630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695
static bool chk_code_allowed(u16 code_to_probe)
{
	static const bool codes[] = {
		/* 32 bit ALU operations */
		[BPF_ALU | BPF_ADD | BPF_K] = true,
		[BPF_ALU | BPF_ADD | BPF_X] = true,
		[BPF_ALU | BPF_SUB | BPF_K] = true,
		[BPF_ALU | BPF_SUB | BPF_X] = true,
		[BPF_ALU | BPF_MUL | BPF_K] = true,
		[BPF_ALU | BPF_MUL | BPF_X] = true,
		[BPF_ALU | BPF_DIV | BPF_K] = true,
		[BPF_ALU | BPF_DIV | BPF_X] = true,
		[BPF_ALU | BPF_MOD | BPF_K] = true,
		[BPF_ALU | BPF_MOD | BPF_X] = true,
		[BPF_ALU | BPF_AND | BPF_K] = true,
		[BPF_ALU | BPF_AND | BPF_X] = true,
		[BPF_ALU | BPF_OR | BPF_K] = true,
		[BPF_ALU | BPF_OR | BPF_X] = true,
		[BPF_ALU | BPF_XOR | BPF_K] = true,
		[BPF_ALU | BPF_XOR | BPF_X] = true,
		[BPF_ALU | BPF_LSH | BPF_K] = true,
		[BPF_ALU | BPF_LSH | BPF_X] = true,
		[BPF_ALU | BPF_RSH | BPF_K] = true,
		[BPF_ALU | BPF_RSH | BPF_X] = true,
		[BPF_ALU | BPF_NEG] = true,
		/* Load instructions */
		[BPF_LD | BPF_W | BPF_ABS] = true,
		[BPF_LD | BPF_H | BPF_ABS] = true,
		[BPF_LD | BPF_B | BPF_ABS] = true,
		[BPF_LD | BPF_W | BPF_LEN] = true,
		[BPF_LD | BPF_W | BPF_IND] = true,
		[BPF_LD | BPF_H | BPF_IND] = true,
		[BPF_LD | BPF_B | BPF_IND] = true,
		[BPF_LD | BPF_IMM] = true,
		[BPF_LD | BPF_MEM] = true,
		[BPF_LDX | BPF_W | BPF_LEN] = true,
		[BPF_LDX | BPF_B | BPF_MSH] = true,
		[BPF_LDX | BPF_IMM] = true,
		[BPF_LDX | BPF_MEM] = true,
		/* Store instructions */
		[BPF_ST] = true,
		[BPF_STX] = true,
		/* Misc instructions */
		[BPF_MISC | BPF_TAX] = true,
		[BPF_MISC | BPF_TXA] = true,
		/* Return instructions */
		[BPF_RET | BPF_K] = true,
		[BPF_RET | BPF_A] = true,
		/* Jump instructions */
		[BPF_JMP | BPF_JA] = true,
		[BPF_JMP | BPF_JEQ | BPF_K] = true,
		[BPF_JMP | BPF_JEQ | BPF_X] = true,
		[BPF_JMP | BPF_JGE | BPF_K] = true,
		[BPF_JMP | BPF_JGE | BPF_X] = true,
		[BPF_JMP | BPF_JGT | BPF_K] = true,
		[BPF_JMP | BPF_JGT | BPF_X] = true,
		[BPF_JMP | BPF_JSET | BPF_K] = true,
		[BPF_JMP | BPF_JSET | BPF_X] = true,
	};

	if (code_to_probe >= ARRAY_SIZE(codes))
		return false;

	return codes[code_to_probe];
}

L
Linus Torvalds 已提交
696
/**
697
 *	bpf_check_classic - verify socket filter code
L
Linus Torvalds 已提交
698 699 700 701 702
 *	@filter: filter to verify
 *	@flen: length of filter
 *
 * Check the user's filter code. If we let some ugly
 * filter code slip through kaboom! The filter must contain
703 704
 * no references or jumps that are out of range, no illegal
 * instructions, and must end with a RET instruction.
L
Linus Torvalds 已提交
705
 *
706 707 708
 * All jumps are forward as they are not signed.
 *
 * Returns 0 if the rule set is legal or -EINVAL if not.
L
Linus Torvalds 已提交
709
 */
710
int bpf_check_classic(const struct sock_filter *filter, unsigned int flen)
L
Linus Torvalds 已提交
711
{
712
	bool anc_found;
713
	int pc;
L
Linus Torvalds 已提交
714

715
	if (flen == 0 || flen > BPF_MAXINSNS)
L
Linus Torvalds 已提交
716 717
		return -EINVAL;

718
	/* Check the filter code now */
L
Linus Torvalds 已提交
719
	for (pc = 0; pc < flen; pc++) {
720
		const struct sock_filter *ftest = &filter[pc];
721

722 723
		/* May we actually operate on this code? */
		if (!chk_code_allowed(ftest->code))
724
			return -EINVAL;
725

726
		/* Some instructions need special checks */
727 728 729 730
		switch (ftest->code) {
		case BPF_ALU | BPF_DIV | BPF_K:
		case BPF_ALU | BPF_MOD | BPF_K:
			/* Check for division by zero */
E
Eric Dumazet 已提交
731 732 733
			if (ftest->k == 0)
				return -EINVAL;
			break;
734 735 736 737 738
		case BPF_LD | BPF_MEM:
		case BPF_LDX | BPF_MEM:
		case BPF_ST:
		case BPF_STX:
			/* Check for invalid memory addresses */
739 740 741
			if (ftest->k >= BPF_MEMWORDS)
				return -EINVAL;
			break;
742 743
		case BPF_JMP | BPF_JA:
			/* Note, the large ftest->k might cause loops.
744 745 746
			 * Compare this with conditional jumps below,
			 * where offsets are limited. --ANK (981016)
			 */
747
			if (ftest->k >= (unsigned int)(flen - pc - 1))
748
				return -EINVAL;
749
			break;
750 751 752 753 754 755 756 757 758
		case BPF_JMP | BPF_JEQ | BPF_K:
		case BPF_JMP | BPF_JEQ | BPF_X:
		case BPF_JMP | BPF_JGE | BPF_K:
		case BPF_JMP | BPF_JGE | BPF_X:
		case BPF_JMP | BPF_JGT | BPF_K:
		case BPF_JMP | BPF_JGT | BPF_X:
		case BPF_JMP | BPF_JSET | BPF_K:
		case BPF_JMP | BPF_JSET | BPF_X:
			/* Both conditionals must be safe */
759
			if (pc + ftest->jt + 1 >= flen ||
760 761
			    pc + ftest->jf + 1 >= flen)
				return -EINVAL;
762
			break;
763 764 765
		case BPF_LD | BPF_W | BPF_ABS:
		case BPF_LD | BPF_H | BPF_ABS:
		case BPF_LD | BPF_B | BPF_ABS:
766
			anc_found = false;
767 768 769
			if (bpf_anc_helper(ftest) & BPF_ANC)
				anc_found = true;
			/* Ancillary operation unknown or unsupported */
770 771
			if (anc_found == false && ftest->k >= SKF_AD_OFF)
				return -EINVAL;
772 773
		}
	}
774

775
	/* Last instruction must be a RET code */
776
	switch (filter[flen - 1].code) {
777 778
	case BPF_RET | BPF_K:
	case BPF_RET | BPF_A:
779
		return check_load_and_stores(filter, flen);
780
	}
781

782
	return -EINVAL;
L
Linus Torvalds 已提交
783
}
784
EXPORT_SYMBOL(bpf_check_classic);
L
Linus Torvalds 已提交
785

786 787
static int bpf_prog_store_orig_filter(struct bpf_prog *fp,
				      const struct sock_fprog *fprog)
788
{
789
	unsigned int fsize = bpf_classic_proglen(fprog);
790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806
	struct sock_fprog_kern *fkprog;

	fp->orig_prog = kmalloc(sizeof(*fkprog), GFP_KERNEL);
	if (!fp->orig_prog)
		return -ENOMEM;

	fkprog = fp->orig_prog;
	fkprog->len = fprog->len;
	fkprog->filter = kmemdup(fp->insns, fsize, GFP_KERNEL);
	if (!fkprog->filter) {
		kfree(fp->orig_prog);
		return -ENOMEM;
	}

	return 0;
}

807
static void bpf_release_orig_filter(struct bpf_prog *fp)
808 809 810 811 812 813 814 815 816
{
	struct sock_fprog_kern *fprog = fp->orig_prog;

	if (fprog) {
		kfree(fprog->filter);
		kfree(fprog);
	}
}

817 818 819 820 821 822
static void __bpf_prog_release(struct bpf_prog *prog)
{
	bpf_release_orig_filter(prog);
	bpf_prog_free(prog);
}

823 824
static void __sk_filter_release(struct sk_filter *fp)
{
825 826
	__bpf_prog_release(fp->prog);
	kfree(fp);
827 828
}

829
/**
E
Eric Dumazet 已提交
830
 * 	sk_filter_release_rcu - Release a socket filter by rcu_head
831 832
 *	@rcu: rcu_head that contains the sk_filter to free
 */
833
static void sk_filter_release_rcu(struct rcu_head *rcu)
834 835 836
{
	struct sk_filter *fp = container_of(rcu, struct sk_filter, rcu);

837
	__sk_filter_release(fp);
838
}
839 840 841 842 843 844 845 846 847 848 849 850 851 852 853

/**
 *	sk_filter_release - release a socket filter
 *	@fp: filter to remove
 *
 *	Remove a filter from a socket and release its resources.
 */
static void sk_filter_release(struct sk_filter *fp)
{
	if (atomic_dec_and_test(&fp->refcnt))
		call_rcu(&fp->rcu, sk_filter_release_rcu);
}

void sk_filter_uncharge(struct sock *sk, struct sk_filter *fp)
{
854
	u32 filter_size = bpf_prog_size(fp->prog->len);
855

856 857
	atomic_sub(filter_size, &sk->sk_omem_alloc);
	sk_filter_release(fp);
858
}
859

860 861 862 863
/* try to charge the socket memory if there is space available
 * return true on success
 */
bool sk_filter_charge(struct sock *sk, struct sk_filter *fp)
864
{
865
	u32 filter_size = bpf_prog_size(fp->prog->len);
866 867 868 869 870 871 872

	/* same check as in sock_kmalloc() */
	if (filter_size <= sysctl_optmem_max &&
	    atomic_read(&sk->sk_omem_alloc) + filter_size < sysctl_optmem_max) {
		atomic_inc(&fp->refcnt);
		atomic_add(filter_size, &sk->sk_omem_alloc);
		return true;
873
	}
874
	return false;
875 876
}

877
static struct bpf_prog *bpf_migrate_filter(struct bpf_prog *fp)
878 879
{
	struct sock_filter *old_prog;
880
	struct bpf_prog *old_fp;
881
	int err, new_len, old_len = fp->len;
882 883 884 885 886 887 888

	/* We are free to overwrite insns et al right here as it
	 * won't be used at this point in time anymore internally
	 * after the migration to the internal BPF instruction
	 * representation.
	 */
	BUILD_BUG_ON(sizeof(struct sock_filter) !=
889
		     sizeof(struct bpf_insn));
890 891 892 893 894 895 896 897 898 899 900 901 902

	/* Conversion cannot happen on overlapping memory areas,
	 * so we need to keep the user BPF around until the 2nd
	 * pass. At this time, the user BPF is stored in fp->insns.
	 */
	old_prog = kmemdup(fp->insns, old_len * sizeof(struct sock_filter),
			   GFP_KERNEL);
	if (!old_prog) {
		err = -ENOMEM;
		goto out_err;
	}

	/* 1st pass: calculate the new program length. */
903
	err = bpf_convert_filter(old_prog, old_len, NULL, &new_len);
904 905 906 907 908
	if (err)
		goto out_err_free;

	/* Expand fp for appending the new filter representation. */
	old_fp = fp;
909
	fp = bpf_prog_realloc(old_fp, bpf_prog_size(new_len), 0);
910 911 912 913 914 915 916 917 918 919 920
	if (!fp) {
		/* The old_fp is still around in case we couldn't
		 * allocate new memory, so uncharge on that one.
		 */
		fp = old_fp;
		err = -ENOMEM;
		goto out_err_free;
	}

	fp->len = new_len;

921
	/* 2nd pass: remap sock_filter insns into bpf_insn insns. */
922
	err = bpf_convert_filter(old_prog, old_len, fp->insnsi, &new_len);
923
	if (err)
924
		/* 2nd bpf_convert_filter() can fail only if it fails
925 926
		 * to allocate memory, remapping must succeed. Note,
		 * that at this time old_fp has already been released
927
		 * by krealloc().
928 929 930
		 */
		goto out_err_free;

931
	bpf_prog_select_runtime(fp);
932

933 934 935 936 937 938
	kfree(old_prog);
	return fp;

out_err_free:
	kfree(old_prog);
out_err:
939
	__bpf_prog_release(fp);
940 941 942
	return ERR_PTR(err);
}

943
static struct bpf_prog *bpf_prepare_filter(struct bpf_prog *fp)
944 945 946
{
	int err;

947
	fp->bpf_func = NULL;
948
	fp->jited = false;
949

950
	err = bpf_check_classic(fp->insns, fp->len);
951
	if (err) {
952
		__bpf_prog_release(fp);
953
		return ERR_PTR(err);
954
	}
955

956 957 958
	/* Probe if we can JIT compile the filter and if so, do
	 * the compilation of the filter.
	 */
959
	bpf_jit_compile(fp);
960 961 962 963

	/* JIT compiler couldn't process this filter, so do the
	 * internal BPF translation for the optimized interpreter.
	 */
964
	if (!fp->jited)
965
		fp = bpf_migrate_filter(fp);
966 967

	return fp;
968 969 970
}

/**
971
 *	bpf_prog_create - create an unattached filter
R
Randy Dunlap 已提交
972
 *	@pfp: the unattached filter that is created
973
 *	@fprog: the filter program
974
 *
R
Randy Dunlap 已提交
975
 * Create a filter independent of any socket. We first run some
976 977 978 979
 * sanity checks on it to make sure it does not explode on us later.
 * If an error occurs or there is insufficient memory for the filter
 * a negative errno code is returned. On success the return is zero.
 */
980
int bpf_prog_create(struct bpf_prog **pfp, struct sock_fprog_kern *fprog)
981
{
982
	unsigned int fsize = bpf_classic_proglen(fprog);
983
	struct bpf_prog *fp;
984 985 986 987 988

	/* Make sure new filter is there and in the right amounts. */
	if (fprog->filter == NULL)
		return -EINVAL;

989
	fp = bpf_prog_alloc(bpf_prog_size(fprog->len), 0);
990 991
	if (!fp)
		return -ENOMEM;
992

993 994 995
	memcpy(fp->insns, fprog->filter, fsize);

	fp->len = fprog->len;
996 997 998 999 1000
	/* Since unattached filters are not copied back to user
	 * space through sk_get_filter(), we do not need to hold
	 * a copy here, and can spare us the work.
	 */
	fp->orig_prog = NULL;
1001

1002
	/* bpf_prepare_filter() already takes care of freeing
1003 1004
	 * memory in case something goes wrong.
	 */
1005
	fp = bpf_prepare_filter(fp);
1006 1007
	if (IS_ERR(fp))
		return PTR_ERR(fp);
1008 1009 1010 1011

	*pfp = fp;
	return 0;
}
1012
EXPORT_SYMBOL_GPL(bpf_prog_create);
1013

1014
void bpf_prog_destroy(struct bpf_prog *fp)
1015
{
1016
	__bpf_prog_release(fp);
1017
}
1018
EXPORT_SYMBOL_GPL(bpf_prog_destroy);
1019

L
Linus Torvalds 已提交
1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031
/**
 *	sk_attach_filter - attach a socket filter
 *	@fprog: the filter program
 *	@sk: the socket to use
 *
 * Attach the user's filter code. We first run some sanity checks on
 * it to make sure it does not explode on us later. If an error
 * occurs or there is insufficient memory for the filter a negative
 * errno code is returned. On success the return is zero.
 */
int sk_attach_filter(struct sock_fprog *fprog, struct sock *sk)
{
1032
	struct sk_filter *fp, *old_fp;
1033
	unsigned int fsize = bpf_classic_proglen(fprog);
1034 1035
	unsigned int bpf_fsize = bpf_prog_size(fprog->len);
	struct bpf_prog *prog;
L
Linus Torvalds 已提交
1036 1037
	int err;

1038 1039 1040
	if (sock_flag(sk, SOCK_FILTER_LOCKED))
		return -EPERM;

L
Linus Torvalds 已提交
1041
	/* Make sure new filter is there and in the right amounts. */
1042 1043
	if (fprog->filter == NULL)
		return -EINVAL;
L
Linus Torvalds 已提交
1044

1045
	prog = bpf_prog_alloc(bpf_fsize, 0);
1046
	if (!prog)
L
Linus Torvalds 已提交
1047
		return -ENOMEM;
1048

1049 1050
	if (copy_from_user(prog->insns, fprog->filter, fsize)) {
		kfree(prog);
L
Linus Torvalds 已提交
1051 1052 1053
		return -EFAULT;
	}

1054
	prog->len = fprog->len;
L
Linus Torvalds 已提交
1055

1056
	err = bpf_prog_store_orig_filter(prog, fprog);
1057
	if (err) {
1058
		kfree(prog);
1059 1060 1061
		return -ENOMEM;
	}

1062
	/* bpf_prepare_filter() already takes care of freeing
1063 1064
	 * memory in case something goes wrong.
	 */
1065 1066 1067 1068 1069 1070 1071 1072 1073 1074
	prog = bpf_prepare_filter(prog);
	if (IS_ERR(prog))
		return PTR_ERR(prog);

	fp = kmalloc(sizeof(*fp), GFP_KERNEL);
	if (!fp) {
		__bpf_prog_release(prog);
		return -ENOMEM;
	}
	fp->prog = prog;
L
Linus Torvalds 已提交
1075

1076 1077 1078 1079 1080 1081 1082
	atomic_set(&fp->refcnt, 0);

	if (!sk_filter_charge(sk, fp)) {
		__sk_filter_release(fp);
		return -ENOMEM;
	}

1083 1084
	old_fp = rcu_dereference_protected(sk->sk_filter,
					   sock_owned_by_user(sk));
1085 1086
	rcu_assign_pointer(sk->sk_filter, fp);

1087
	if (old_fp)
E
Eric Dumazet 已提交
1088
		sk_filter_uncharge(sk, old_fp);
1089

1090
	return 0;
L
Linus Torvalds 已提交
1091
}
1092
EXPORT_SYMBOL_GPL(sk_attach_filter);
L
Linus Torvalds 已提交
1093

1094 1095 1096 1097 1098
int sk_detach_filter(struct sock *sk)
{
	int ret = -ENOENT;
	struct sk_filter *filter;

1099 1100 1101
	if (sock_flag(sk, SOCK_FILTER_LOCKED))
		return -EPERM;

1102 1103
	filter = rcu_dereference_protected(sk->sk_filter,
					   sock_owned_by_user(sk));
1104
	if (filter) {
1105
		RCU_INIT_POINTER(sk->sk_filter, NULL);
E
Eric Dumazet 已提交
1106
		sk_filter_uncharge(sk, filter);
1107 1108
		ret = 0;
	}
1109

1110 1111
	return ret;
}
1112
EXPORT_SYMBOL_GPL(sk_detach_filter);
1113

1114 1115
int sk_get_filter(struct sock *sk, struct sock_filter __user *ubuf,
		  unsigned int len)
1116
{
1117
	struct sock_fprog_kern *fprog;
1118
	struct sk_filter *filter;
1119
	int ret = 0;
1120 1121 1122

	lock_sock(sk);
	filter = rcu_dereference_protected(sk->sk_filter,
1123
					   sock_owned_by_user(sk));
1124 1125
	if (!filter)
		goto out;
1126 1127 1128 1129

	/* We're copying the filter that has been originally attached,
	 * so no conversion/decode needed anymore.
	 */
1130
	fprog = filter->prog->orig_prog;
1131 1132

	ret = fprog->len;
1133
	if (!len)
1134
		/* User space only enquires number of filter blocks. */
1135
		goto out;
1136

1137
	ret = -EINVAL;
1138
	if (len < fprog->len)
1139 1140 1141
		goto out;

	ret = -EFAULT;
1142
	if (copy_to_user(ubuf, fprog->filter, bpf_classic_proglen(fprog)))
1143
		goto out;
1144

1145 1146 1147 1148
	/* Instead of bytes, the API requests to return the number
	 * of filter blocks.
	 */
	ret = fprog->len;
1149 1150 1151 1152
out:
	release_sock(sk);
	return ret;
}