Message ID | 20200624133005.22046-1-dxld@darkboxed.org |
---|---|
State | Accepted |
Delegated to: | Pablo Neira |
Headers | show |
Series | [libnf_ct,v2,1/9] Handle negative snprintf return values properly | expand |
On Wed, Jun 24, 2020 at 03:29:57PM +0200, Daniel Gröber wrote: > Currently the BUFFER_SIZE macro doesn't take negative 'ret' values into > account. A negative return should just be passed through to the caller, > snprintf will already have set 'errno' properly. Series applied, thanks. > diff --git a/include/internal/internal.h b/include/internal/internal.h > index bb44e12..b1fc670 100644 > --- a/include/internal/internal.h > +++ b/include/internal/internal.h > @@ -41,6 +41,8 @@ > #endif > > #define BUFFER_SIZE(ret, size, len, offset) \ > + if (ret < 0) \ > + return -1; \ Side note: I don't like this hidden branch under a macro. But snprintf() == -1 is unlikely to happen and I don't have a better idea to deal with this case ATM.
On Wed, Jul 01, 2020 at 01:09:51PM +0200, Pablo Neira Ayuso wrote: > On Wed, Jun 24, 2020 at 03:29:57PM +0200, Daniel Gröber wrote: > > Currently the BUFFER_SIZE macro doesn't take negative 'ret' values into > > account. A negative return should just be passed through to the caller, > > snprintf will already have set 'errno' properly. > > Series applied, thanks. Great, thanks! > > diff --git a/include/internal/internal.h b/include/internal/internal.h > > index bb44e12..b1fc670 100644 > > --- a/include/internal/internal.h > > +++ b/include/internal/internal.h > > @@ -41,6 +41,8 @@ > > #endif > > > > #define BUFFER_SIZE(ret, size, len, offset) \ > > + if (ret < 0) \ > > + return -1; \ > > Side note: I don't like this hidden branch under a macro. But > snprintf() == -1 is unlikely to happen and I don't have a better idea > to deal with this case ATM. Since there is already another branch in this macro I take it the issue is the part where we return now, right? I can see how this is kind of nasty being completely implicit and all, how about using a label and passing the name to the macro? Something like: ret = snprintf(...) BUFFER_SIZE_ERR(ret, size, len, offset, err); [...] err: return -1; --Daniel
diff --git a/include/internal/internal.h b/include/internal/internal.h index bb44e12..b1fc670 100644 --- a/include/internal/internal.h +++ b/include/internal/internal.h @@ -41,6 +41,8 @@ #endif #define BUFFER_SIZE(ret, size, len, offset) \ + if (ret < 0) \ + return -1; \ size += ret; \ if (ret > len) \ ret = len; \ diff --git a/src/conntrack/api.c b/src/conntrack/api.c index ffa5216..78d7d61 100644 --- a/src/conntrack/api.c +++ b/src/conntrack/api.c @@ -1099,9 +1099,9 @@ int nfct_catch(struct nfct_handle *h) * print the message just after you receive the destroy event. If you want * more accurate timestamping, use NFCT_OF_TIMESTAMP. * - * This function returns the size of the information that _would_ have been - * written to the buffer, even if there was no room for it. Thus, the - * behaviour is similar to snprintf. + * On error, -1 is returned and errno is set appropiately. Otherwise the + * size of what _would_ be written is returned, even if the size of the + * buffer is insufficient. This behaviour is similar to snprintf. */ int nfct_snprintf(char *buf, unsigned int size, diff --git a/src/conntrack/snprintf.c b/src/conntrack/snprintf.c index 17ad885..eb26af4 100644 --- a/src/conntrack/snprintf.c +++ b/src/conntrack/snprintf.c @@ -85,6 +85,9 @@ int __snprintf_conntrack(char *buf, return -1; } + if (size < 0) + return size; + /* NULL terminated string */ buf[size+1 > len ? len-1 : size] = '\0'; diff --git a/src/expect/snprintf.c b/src/expect/snprintf.c index 3a104b5..8c2f3e4 100644 --- a/src/expect/snprintf.c +++ b/src/expect/snprintf.c @@ -30,6 +30,9 @@ int __snprintf_expect(char *buf, return -1; } + if (size < 0) + return size; + /* NULL terminated string */ buf[size+1 > len ? len-1 : size] = '\0';
Currently the BUFFER_SIZE macro doesn't take negative 'ret' values into account. A negative return should just be passed through to the caller, snprintf will already have set 'errno' properly. Signed-off-by: Daniel Gröber <dxld@darkboxed.org> --- include/internal/internal.h | 2 ++ src/conntrack/api.c | 6 +++--- src/conntrack/snprintf.c | 3 +++ src/expect/snprintf.c | 3 +++ 4 files changed, 11 insertions(+), 3 deletions(-)