]> git.ipfire.org Git - thirdparty/libnftnl.git/commitdiff
internal: fix SNPRINTF_BUFFER_SIZE macro
authorArturo Borrero <arturo.borrero.glez@gmail.com>
Tue, 13 May 2014 07:08:15 +0000 (09:08 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Tue, 13 May 2014 15:22:52 +0000 (17:22 +0200)
We need to store in 'offset' the complete amount of characters as returned
from _snprintf. The value means how many characters long needs the buffer to be
in order to store the corresponding string expansion.

Before this patch, in cases where the buffer is smaller than the
expansion, then ret > len, and therefore ret = len.
So when incrementing offset, we do it with a wrong value.

All previous versions of libnftnl are unable to handle this situations: small
buffers (or long string expansion).

BTW, if a caller must reallocate a buffer to the returned value of snprintf, it
should be ret + 1.

While at it, let's add a check to know if the last snprintf call failed.

Signed-off-by: Arturo Borrero Gonzalez <arturo.borrero.glez@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
src/internal.h

index 6595e707d2b458cb89b51ef8f8cd81623e7a7182..b06f1665a35e88432dc15788769d6d9fa99a3f6b 100644 (file)
@@ -183,10 +183,12 @@ struct nft_set_elem {
 };
 
 #define SNPRINTF_BUFFER_SIZE(ret, size, len, offset)   \
-       size += ret;                                    \
+       if (ret < 0)                                    \
+               return ret;                             \
+       offset += ret;                                  \
        if (ret > len)                                  \
                ret = len;                              \
-       offset += ret;                                  \
+       size += ret;                                    \
        len -= ret;
 
 #define div_round_up(n, d)     (((n) + (d) - 1) / (d))