mirror of
https://git.proxmox.com/git/mirror_iproute2
synced 2025-12-04 21:31:51 +00:00
bpf: Make bytecode-file reading a little more robust
bpf_parse_string() will now correctly handle: - Extraneous whitespace, - OPs on multiple lines and - overlong file names. The added feature of allowing to have OPs on multiple lines (like e.g. tcpdump prints them) is rather a side effect of fixing detection of malformed bytecode files having random content on a second line, like e.g.: | 4,40 0 0 12,21 0 1 2048,6 0 0 262144,6 0 0 0 | foobar Cc: Daniel Borkmann <daniel@iogearbox.net> Signed-off-by: Phil Sutter <phil@nwl.cc> Acked-by: Daniel Borkmann <daniel@iogearbox.net>
This commit is contained in:
parent
f73ac674d0
commit
3da3ebfca8
32
lib/bpf.c
32
lib/bpf.c
@ -208,11 +208,11 @@ static int bpf_parse_string(char *arg, bool from_file, __u16 *bpf_len,
|
|||||||
|
|
||||||
if (from_file) {
|
if (from_file) {
|
||||||
size_t tmp_len, op_len = sizeof("65535 255 255 4294967295,");
|
size_t tmp_len, op_len = sizeof("65535 255 255 4294967295,");
|
||||||
char *tmp_string, *last;
|
char *tmp_string, *pos, c, c_prev = ' ';
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
|
|
||||||
tmp_len = sizeof("4096,") + BPF_MAXINSNS * op_len;
|
tmp_len = sizeof("4096,") + BPF_MAXINSNS * op_len;
|
||||||
tmp_string = calloc(1, tmp_len);
|
tmp_string = pos = calloc(1, tmp_len);
|
||||||
if (tmp_string == NULL)
|
if (tmp_string == NULL)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
@ -223,17 +223,33 @@ static int bpf_parse_string(char *arg, bool from_file, __u16 *bpf_len,
|
|||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!fgets(tmp_string, tmp_len, fp)) {
|
while ((c = fgetc(fp)) != EOF) {
|
||||||
|
switch (c) {
|
||||||
|
case '\n':
|
||||||
|
if (c_prev != ',')
|
||||||
|
*(pos++) = ',';
|
||||||
|
break;
|
||||||
|
case ' ':
|
||||||
|
case '\t':
|
||||||
|
if (c_prev != ' ')
|
||||||
|
*(pos++) = c;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
*(pos++) = c;
|
||||||
|
}
|
||||||
|
if (pos - tmp_string == tmp_len)
|
||||||
|
break;
|
||||||
|
c_prev = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!feof(fp)) {
|
||||||
free(tmp_string);
|
free(tmp_string);
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
return -EIO;
|
return -E2BIG;
|
||||||
}
|
}
|
||||||
|
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
|
*pos = 0;
|
||||||
last = &tmp_string[strlen(tmp_string) - 1];
|
|
||||||
if (*last == '\n')
|
|
||||||
*last = 0;
|
|
||||||
|
|
||||||
*need_release = true;
|
*need_release = true;
|
||||||
*bpf_string = tmp_string;
|
*bpf_string = tmp_string;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user