diff mbox series

[libnf_ct,resend,1/8] Handle negative snprintf return values properly

Message ID 20200623123403.31676-2-dxld@darkboxed.org
State Changes Requested
Delegated to: Pablo Neira
Headers show
Series [libnf_ct,resend,1/8] Handle negative snprintf return values properly | expand

Commit Message

Daniel Gröber June 23, 2020, 12:33 p.m. UTC
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(-)

Comments

Pablo Neira Ayuso June 24, 2020, 10:45 a.m. UTC | #1
On Tue, Jun 23, 2020 at 02:33:56PM +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.
> 
> 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(-)
> 
> diff --git a/include/internal/internal.h b/include/internal/internal.h
> index bb44e12..859724b 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)					\

        if (ret < 0)
          ^
missing space

> +		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..a87c0c9 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)
   ^^^^^^^^
I can see spaces here as indentations.

> +                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..b28ac62 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';
>  
> -- 
> 2.20.1
>
diff mbox series

Patch

diff --git a/include/internal/internal.h b/include/internal/internal.h
index bb44e12..859724b 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..a87c0c9 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..b28ac62 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';