diff options
Diffstat (limited to 'net/core')
-rw-r--r-- | net/core/filter.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/net/core/filter.c b/net/core/filter.c index 907efd27ec77..fbe3a8d12570 100644 --- a/net/core/filter.c +++ b/net/core/filter.c | |||
@@ -167,6 +167,14 @@ unsigned int sk_run_filter(const struct sk_buff *skb, | |||
167 | case BPF_S_ALU_DIV_K: | 167 | case BPF_S_ALU_DIV_K: |
168 | A = reciprocal_divide(A, K); | 168 | A = reciprocal_divide(A, K); |
169 | continue; | 169 | continue; |
170 | case BPF_S_ALU_MOD_X: | ||
171 | if (X == 0) | ||
172 | return 0; | ||
173 | A %= X; | ||
174 | continue; | ||
175 | case BPF_S_ALU_MOD_K: | ||
176 | A %= K; | ||
177 | continue; | ||
170 | case BPF_S_ALU_AND_X: | 178 | case BPF_S_ALU_AND_X: |
171 | A &= X; | 179 | A &= X; |
172 | continue; | 180 | continue; |
@@ -469,6 +477,8 @@ int sk_chk_filter(struct sock_filter *filter, unsigned int flen) | |||
469 | [BPF_ALU|BPF_MUL|BPF_K] = BPF_S_ALU_MUL_K, | 477 | [BPF_ALU|BPF_MUL|BPF_K] = BPF_S_ALU_MUL_K, |
470 | [BPF_ALU|BPF_MUL|BPF_X] = BPF_S_ALU_MUL_X, | 478 | [BPF_ALU|BPF_MUL|BPF_X] = BPF_S_ALU_MUL_X, |
471 | [BPF_ALU|BPF_DIV|BPF_X] = BPF_S_ALU_DIV_X, | 479 | [BPF_ALU|BPF_DIV|BPF_X] = BPF_S_ALU_DIV_X, |
480 | [BPF_ALU|BPF_MOD|BPF_K] = BPF_S_ALU_MOD_K, | ||
481 | [BPF_ALU|BPF_MOD|BPF_X] = BPF_S_ALU_MOD_X, | ||
472 | [BPF_ALU|BPF_AND|BPF_K] = BPF_S_ALU_AND_K, | 482 | [BPF_ALU|BPF_AND|BPF_K] = BPF_S_ALU_AND_K, |
473 | [BPF_ALU|BPF_AND|BPF_X] = BPF_S_ALU_AND_X, | 483 | [BPF_ALU|BPF_AND|BPF_X] = BPF_S_ALU_AND_X, |
474 | [BPF_ALU|BPF_OR|BPF_K] = BPF_S_ALU_OR_K, | 484 | [BPF_ALU|BPF_OR|BPF_K] = BPF_S_ALU_OR_K, |
@@ -531,6 +541,11 @@ int sk_chk_filter(struct sock_filter *filter, unsigned int flen) | |||
531 | return -EINVAL; | 541 | return -EINVAL; |
532 | ftest->k = reciprocal_value(ftest->k); | 542 | ftest->k = reciprocal_value(ftest->k); |
533 | break; | 543 | break; |
544 | case BPF_S_ALU_MOD_K: | ||
545 | /* check for division by zero */ | ||
546 | if (ftest->k == 0) | ||
547 | return -EINVAL; | ||
548 | break; | ||
534 | case BPF_S_LD_MEM: | 549 | case BPF_S_LD_MEM: |
535 | case BPF_S_LDX_MEM: | 550 | case BPF_S_LDX_MEM: |
536 | case BPF_S_ST: | 551 | case BPF_S_ST: |