]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
erec: fix logic when reading from file
authorEric Leblond <eric@regit.org>
Wed, 24 Jun 2015 07:51:50 +0000 (09:51 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Mon, 29 Jun 2015 23:32:00 +0000 (01:32 +0200)
In case we are reading the rules from a file we need to reset the
file descriptor to the original position when calling erec_print.

This was not the case in previous code and was leading to valid
file to be seen as invalid when treated in debug mode.

Signed-off-by: Eric Leblond <eric@regit.org>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
src/erec.c

index 8abed4d94f20e500ae01b1e8d8c9c20dd1fb917c..d5142307791195da3bc9dab6e58f6a2bae7816dd 100644 (file)
@@ -86,6 +86,7 @@ void erec_print(FILE *f, const struct error_record *erec)
        char *pbuf = NULL;
        unsigned int i, end;
        int l, ret;
+       off_t orig_offset = 0;
 
        switch (indesc->type) {
        case INDESC_BUFFER:
@@ -94,11 +95,13 @@ void erec_print(FILE *f, const struct error_record *erec)
                break;
        case INDESC_FILE:
                memset(buf, 0, sizeof(buf));
+               orig_offset = lseek(indesc->fd, 0, SEEK_CUR);
                lseek(indesc->fd, loc->line_offset, SEEK_SET);
                ret = read(indesc->fd, buf, sizeof(buf) - 1);
                if (ret > 0)
                        *strchrnul(buf, '\n') = '\0';
                line = buf;
+               lseek(indesc->fd, orig_offset, SEEK_SET);
                break;
        case INDESC_INTERNAL:
        case INDESC_NETLINK: