|
|
36cfb7 |
From 584ca9f67952162dfdd02d984aa12640e45a4235 Mon Sep 17 00:00:00 2001
|
|
|
36cfb7 |
From: Phil Sutter <psutter@redhat.com>
|
|
|
36cfb7 |
Date: Wed, 6 Sep 2017 11:53:53 +0200
|
|
|
36cfb7 |
Subject: [PATCH] lib/bpf: Fix bytecode-file parsing
|
|
|
36cfb7 |
|
|
|
36cfb7 |
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1477491
|
|
|
36cfb7 |
Upstream Status: iproute2.git commit 7c87c7fed18d1
|
|
|
36cfb7 |
|
|
|
36cfb7 |
commit 7c87c7fed18d1162e045c8331cb68fa440bc5728
|
|
|
36cfb7 |
Author: Phil Sutter <phil@nwl.cc>
|
|
|
36cfb7 |
Date: Tue Aug 29 17:09:45 2017 +0200
|
|
|
36cfb7 |
|
|
|
36cfb7 |
lib/bpf: Fix bytecode-file parsing
|
|
|
36cfb7 |
|
|
|
36cfb7 |
The signedness of char type is implementation dependent, and there are
|
|
|
36cfb7 |
architectures on which it is unsigned by default. In that case, the
|
|
|
36cfb7 |
check whether fgetc() returned EOF failed because the return value was
|
|
|
36cfb7 |
assigned an (unsigned) char variable prior to comparison with EOF (which
|
|
|
36cfb7 |
is defined to -1). Fix this by using int as type for 'c' variable, which
|
|
|
36cfb7 |
also matches the declaration of fgetc().
|
|
|
36cfb7 |
|
|
|
36cfb7 |
While being at it, fix the parser logic to correctly handle multiple
|
|
|
36cfb7 |
empty lines and consecutive whitespace and tab characters to further
|
|
|
36cfb7 |
improve the parser's robustness. Note that this will still detect double
|
|
|
36cfb7 |
separator characters, so doesn't soften up the parser too much.
|
|
|
36cfb7 |
|
|
|
36cfb7 |
Fixes: 3da3ebfca85b8 ("bpf: Make bytecode-file reading a little more robust")
|
|
|
36cfb7 |
Cc: Daniel Borkmann <daniel@iogearbox.net>
|
|
|
36cfb7 |
Signed-off-by: Phil Sutter <phil@nwl.cc>
|
|
|
36cfb7 |
Acked-by: Daniel Borkmann <daniel@iogearbox.net>
|
|
|
36cfb7 |
---
|
|
|
36cfb7 |
lib/bpf.c | 7 +++++--
|
|
|
36cfb7 |
1 file changed, 5 insertions(+), 2 deletions(-)
|
|
|
36cfb7 |
|
|
|
36cfb7 |
diff --git a/lib/bpf.c b/lib/bpf.c
|
|
|
e138d9 |
index 73dac5c37cc91..3aabf44d1abf8 100644
|
|
|
36cfb7 |
--- a/lib/bpf.c
|
|
|
36cfb7 |
+++ b/lib/bpf.c
|
|
|
36cfb7 |
@@ -160,8 +160,9 @@ static int bpf_parse_string(char *arg, bool from_file, __u16 *bpf_len,
|
|
|
36cfb7 |
|
|
|
36cfb7 |
if (from_file) {
|
|
|
36cfb7 |
size_t tmp_len, op_len = sizeof("65535 255 255 4294967295,");
|
|
|
36cfb7 |
- char *tmp_string, *pos, c, c_prev = ' ';
|
|
|
36cfb7 |
+ char *tmp_string, *pos, c_prev = ' ';
|
|
|
36cfb7 |
FILE *fp;
|
|
|
36cfb7 |
+ int c;
|
|
|
36cfb7 |
|
|
|
36cfb7 |
tmp_len = sizeof("4096,") + BPF_MAXINSNS * op_len;
|
|
|
36cfb7 |
tmp_string = pos = calloc(1, tmp_len);
|
|
|
36cfb7 |
@@ -180,18 +181,20 @@ static int bpf_parse_string(char *arg, bool from_file, __u16 *bpf_len,
|
|
|
36cfb7 |
case '\n':
|
|
|
36cfb7 |
if (c_prev != ',')
|
|
|
36cfb7 |
*(pos++) = ',';
|
|
|
36cfb7 |
+ c_prev = ',';
|
|
|
36cfb7 |
break;
|
|
|
36cfb7 |
case ' ':
|
|
|
36cfb7 |
case '\t':
|
|
|
36cfb7 |
if (c_prev != ' ')
|
|
|
36cfb7 |
*(pos++) = c;
|
|
|
36cfb7 |
+ c_prev = ' ';
|
|
|
36cfb7 |
break;
|
|
|
36cfb7 |
default:
|
|
|
36cfb7 |
*(pos++) = c;
|
|
|
36cfb7 |
+ c_prev = c;
|
|
|
36cfb7 |
}
|
|
|
36cfb7 |
if (pos - tmp_string == tmp_len)
|
|
|
36cfb7 |
break;
|
|
|
36cfb7 |
- c_prev = c;
|
|
|
36cfb7 |
}
|
|
|
36cfb7 |
|
|
|
36cfb7 |
if (!feof(fp)) {
|
|
|
36cfb7 |
--
|
|
|
e138d9 |
2.21.0
|
|
|
36cfb7 |
|