diff --git a/bpf b/bpf index ae7debb..7f7f28a 160000 --- a/bpf +++ b/bpf @@ -1 +1 @@ -Subproject commit ae7debb6bbc03da4312318c2d9faeabcafd1b6ae +Subproject commit 7f7f28a18cf05dba79543ca57cccaa2f41c0541b diff --git a/filter/net-filter.cpp b/filter/net-filter.cpp index ada9ca0..40c7fef 100644 --- a/filter/net-filter.cpp +++ b/filter/net-filter.cpp @@ -341,19 +341,35 @@ bool NetFilter::load_rules(const char *rule_file) char *line = NULL; size_t len; ssize_t read; + unsigned int first_key = key_cnt; + auto rollback_loaded_rules = [&]() { + for (unsigned int key = first_key; key < key_cnt; key++) + { + del_rule(key); + } + key_cnt = first_key; + }; while ((read = getline(&line, &len, fp)) != -1) { Rule rule; - if (line[0] == '#' || line[0] == '\n') + while (*line == ' ' || *line == '\t') + { + line++; + } + if (*line == '#' || *line == '\n' || *line == '\0') { continue; } if (!parse_rule(line, rule)) { - continue; + pr_error("syntax error in config file\n"); + rollback_loaded_rules(); + free(line); + fclose(fp); + return false; } int key; @@ -361,7 +377,9 @@ bool NetFilter::load_rules(const char *rule_file) if (key < 0) { - printf("syntax pr_error in config file\n"); + pr_error("failed to add rule from config file\n"); + rollback_loaded_rules(); + free(line); fclose(fp); return false; }