diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/libnftables.c | 9 | ||||
-rw-r--r-- | src/main.c | 5 | ||||
-rw-r--r-- | src/scanner.l | 2 |
3 files changed, 11 insertions, 5 deletions
diff --git a/src/libnftables.c b/src/libnftables.c index 6e271209..8bf989b0 100644 --- a/src/libnftables.c +++ b/src/libnftables.c @@ -280,13 +280,19 @@ int nft_run_cmd_from_buffer(struct nft_ctx *nft, char *buf, size_t buflen) int rc = 0; struct parser_state state; LIST_HEAD(msgs); + size_t nlbuflen; void *scanner; FILE *fp; + char *nlbuf; + + nlbuflen = max(buflen + 1, strlen(buf) + 2); + nlbuf = xzalloc(nlbuflen); + snprintf(nlbuf, nlbuflen, "%s\n", buf); parser_init(nft->nf_sock, &nft->cache, &state, &msgs, nft->debug_mask, &nft->output); scanner = scanner_init(&state); - scanner_push_buffer(scanner, &indesc_cmdline, buf); + scanner_push_buffer(scanner, &indesc_cmdline, nlbuf); if (nft_run(nft, nft->nf_sock, scanner, &state, &msgs) != 0) rc = -1; @@ -296,6 +302,7 @@ int nft_run_cmd_from_buffer(struct nft_ctx *nft, char *buf, size_t buflen) nft_ctx_set_output(nft, fp); scanner_destroy(scanner); iface_cache_release(); + free(nlbuf); return rc; } @@ -264,14 +264,13 @@ int main(int argc, char * const *argv) for (len = 0, i = optind; i < argc; i++) len += strlen(argv[i]) + strlen(" "); - buf = xzalloc(len + 2); + buf = xzalloc(len); for (i = optind; i < argc; i++) { strcat(buf, argv[i]); if (i + 1 < argc) strcat(buf, " "); } - strcat(buf, "\n"); - rc = !!nft_run_cmd_from_buffer(nft, buf, len + 2); + rc = !!nft_run_cmd_from_buffer(nft, buf, len); } else if (filename != NULL) { rc = !!nft_run_cmd_from_filename(nft, filename); } else if (interactive) { diff --git a/src/scanner.l b/src/scanner.l index 1d8e8ba0..d908a8fe 100644 --- a/src/scanner.l +++ b/src/scanner.l @@ -47,7 +47,7 @@ errno = 0; \ clearerr(yyin); \ } \ - if (result > 1) { \ + if (result > 1 && !feof(yyin)) { \ while (result > 1 && \ (buf[result - 1] != '\n' && buf[result - 1] != ' ')) \ result--, n++; \ |