DPDK patches and discussions
 help / color / mirror / Atom feed
* [dpdk-dev] [PATCH] eal: support strlcat function
@ 2019-01-16 12:48 Bruce Richardson
  2019-01-17 10:39 ` Burakov, Anatoly
                   ` (3 more replies)
  0 siblings, 4 replies; 16+ messages in thread
From: Bruce Richardson @ 2019-01-16 12:48 UTC (permalink / raw)
  To: dev; +Cc: Bruce Richardson

Add the strlcat function to DPDK to exist alongside the strlcpy one.  While
strncat is generally safe for use for concatenation, the API for the
strlcat function is perhaps a little nicer to use, and supports truncation
detection.

See commit: 5364de644a4b ("eal: support strlcpy function") for more
details on the function selection logic, since we only should be using the
DPDK-provided version when no system-provided version is present.

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
---
 .../common/include/rte_string_fns.h           | 15 +++++++
 test/test/test_string_fns.c                   | 45 +++++++++++++++++++
 2 files changed, 60 insertions(+)

diff --git a/lib/librte_eal/common/include/rte_string_fns.h b/lib/librte_eal/common/include/rte_string_fns.h
index 9a2a1ff90..e7a1656f0 100644
--- a/lib/librte_eal/common/include/rte_string_fns.h
+++ b/lib/librte_eal/common/include/rte_string_fns.h
@@ -59,10 +59,24 @@ rte_strlcpy(char *dst, const char *src, size_t size)
 	return (size_t)snprintf(dst, size, "%s", src);
 }
 
+/**
+ * @internal
+ * DPDK-specific version of strlcat for systems without
+ * libc or libbsd copies of the function
+ */
+static inline size_t
+rte_strlcat(char *dst, const char *src, size_t size)
+{
+	size_t l = strnlen(dst, size);
+	return l + ((l < size) ?
+		rte_strlcpy(&dst[l], src, size - l) : strlen(src));
+}
+
 /* pull in a strlcpy function */
 #ifdef RTE_EXEC_ENV_BSDAPP
 #ifndef __BSD_VISIBLE /* non-standard functions are hidden */
 #define strlcpy(dst, src, size) rte_strlcpy(dst, src, size)
+#define strlcat(dst, src, size) rte_strlcat(dst, src, size)
 #endif
 
 #else /* non-BSD platforms */
@@ -71,6 +85,7 @@ rte_strlcpy(char *dst, const char *src, size_t size)
 
 #else /* no BSD header files, create own */
 #define strlcpy(dst, src, size) rte_strlcpy(dst, src, size)
+#define strlcat(dst, src, size) rte_strlcat(dst, src, size)
 
 #endif /* RTE_USE_LIBBSD */
 #endif /* BSDAPP */
diff --git a/test/test/test_string_fns.c b/test/test/test_string_fns.c
index 3f091ab92..3bd8ed5d8 100644
--- a/test/test/test_string_fns.c
+++ b/test/test/test_string_fns.c
@@ -129,11 +129,56 @@ test_rte_strsplit(void)
 	return 0;
 }
 
+int
+test_rte_strlcat(void)
+{
+	/* only run actual unit tests if we have system-provided strlcat */
+#if defined(__BSD_VISIBLE) || defined(RTE_USE_LIBBSD)
+#define BUF_LEN 32
+	const char dst[BUF_LEN] = "Test string";
+	const char src[] = " appended";
+	char bsd_dst[BUF_LEN];
+	char rte_dst[BUF_LEN];
+	size_t i, bsd_ret, rte_ret;
+
+	LOG("dst = '%s', strlen(dst) = %zu\n", dst, strlen(dst));
+	LOG("src = '%s', strlen(src) = %zu\n", src, strlen(src));
+	LOG("---\n");
+
+	for (i = 0; i < BUF_LEN; i++) {
+		/* initialize destination buffers */
+		memcpy(bsd_dst, dst, BUF_LEN);
+		memcpy(rte_dst, dst, BUF_LEN);
+		/* compare implementations */
+		bsd_ret = strlcat(bsd_dst, src, i);
+		rte_ret = rte_strlcat(rte_dst, src, i);
+		if (bsd_ret != rte_ret) {
+			LOG("Incorrect retval for buf length = %zu\n", i);
+			LOG("BSD: '%zu', rte: '%zu'\n", bsd_ret, rte_ret);
+			return -1;
+		}
+		if (memcmp(bsd_dst, rte_dst, BUF_LEN) != 0) {
+			LOG("Resulting buffers don't match\n");
+			LOG("BSD: '%s', rte: '%s'\n", bsd_dst, rte_dst);
+			return -1;
+		}
+		LOG("buffer size = %zu: dst = '%s', ret = %zu\n",
+			i, rte_dst, rte_ret);
+	}
+	LOG("Checked %zu combinations\n", i);
+#undef BUF_LEN
+#endif /* defined(__BSD_VISIBLE) || defined(RTE_USE_LIBBSD) */
+
+	return 0;
+}
+
 static int
 test_string_fns(void)
 {
 	if (test_rte_strsplit() < 0)
 		return -1;
+	if (test_rte_strlcat() < 0)
+		return -1;
 	return 0;
 }
 
-- 
2.20.1

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [dpdk-dev] [PATCH] eal: support strlcat function
  2019-01-16 12:48 [dpdk-dev] [PATCH] eal: support strlcat function Bruce Richardson
@ 2019-01-17 10:39 ` Burakov, Anatoly
  2019-01-17 11:00   ` Bruce Richardson
  2019-01-17 13:10 ` Ferruh Yigit
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 16+ messages in thread
From: Burakov, Anatoly @ 2019-01-17 10:39 UTC (permalink / raw)
  To: Bruce Richardson, dev

On 16-Jan-19 12:48 PM, Bruce Richardson wrote:
> Add the strlcat function to DPDK to exist alongside the strlcpy one.  While
> strncat is generally safe for use for concatenation, the API for the
> strlcat function is perhaps a little nicer to use, and supports truncation
> detection.
> 
> See commit: 5364de644a4b ("eal: support strlcpy function") for more
> details on the function selection logic, since we only should be using the
> DPDK-provided version when no system-provided version is present.
> 
> Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
> ---

<...>

>   static int
>   test_string_fns(void)
>   {
>   	if (test_rte_strsplit() < 0)
>   		return -1;
> +	if (test_rte_strlcat() < 0)
> +		return -1;
>   	return 0;
>   }
>   
> 

Unrelated, but do we also need to test strlcpy, strscpy and other 
functions that were introduced?

-- 
Thanks,
Anatoly

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [dpdk-dev] [PATCH] eal: support strlcat function
  2019-01-17 10:39 ` Burakov, Anatoly
@ 2019-01-17 11:00   ` Bruce Richardson
  2019-01-17 11:55     ` Burakov, Anatoly
  0 siblings, 1 reply; 16+ messages in thread
From: Bruce Richardson @ 2019-01-17 11:00 UTC (permalink / raw)
  To: Burakov, Anatoly; +Cc: dev

On Thu, Jan 17, 2019 at 10:39:02AM +0000, Burakov, Anatoly wrote:
> On 16-Jan-19 12:48 PM, Bruce Richardson wrote:
> > Add the strlcat function to DPDK to exist alongside the strlcpy one.
> > While strncat is generally safe for use for concatenation, the API for
> > the strlcat function is perhaps a little nicer to use, and supports
> > truncation detection.
> > 
> > See commit: 5364de644a4b ("eal: support strlcpy function") for more
> > details on the function selection logic, since we only should be using
> > the DPDK-provided version when no system-provided version is present.
> > 
> > Signed-off-by: Bruce Richardson <bruce.richardson@intel.com> ---
> 
> <...>
> 
> >   static int test_string_fns(void) { if (test_rte_strsplit() < 0)
> >   return -1; +	if (test_rte_strlcat() < 0) +		return -1;
> >   return 0; }
> > 
> 
> Unrelated, but do we also need to test strlcpy, strscpy and other
> functions that were introduced?
> 

Yes, I think that would be advisable. I imagine the easiest way to test
them is to do as I have here in running comparisons with a range of inputs,
especially boundary conditions, against a known-good version for platforms
that have the functions built-in.
As always, volunteers and patches welcome... :-)

/Bruce

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [dpdk-dev] [PATCH] eal: support strlcat function
  2019-01-17 11:00   ` Bruce Richardson
@ 2019-01-17 11:55     ` Burakov, Anatoly
  0 siblings, 0 replies; 16+ messages in thread
From: Burakov, Anatoly @ 2019-01-17 11:55 UTC (permalink / raw)
  To: Bruce Richardson; +Cc: dev

On 17-Jan-19 11:00 AM, Bruce Richardson wrote:
> On Thu, Jan 17, 2019 at 10:39:02AM +0000, Burakov, Anatoly wrote:
>> On 16-Jan-19 12:48 PM, Bruce Richardson wrote:
>>> Add the strlcat function to DPDK to exist alongside the strlcpy one.
>>> While strncat is generally safe for use for concatenation, the API for
>>> the strlcat function is perhaps a little nicer to use, and supports
>>> truncation detection.
>>>
>>> See commit: 5364de644a4b ("eal: support strlcpy function") for more
>>> details on the function selection logic, since we only should be using
>>> the DPDK-provided version when no system-provided version is present.
>>>
>>> Signed-off-by: Bruce Richardson <bruce.richardson@intel.com> ---
>>
>> <...>
>>
>>>    static int test_string_fns(void) { if (test_rte_strsplit() < 0)
>>>    return -1; +	if (test_rte_strlcat() < 0) +		return -1;
>>>    return 0; }
>>>
>>
>> Unrelated, but do we also need to test strlcpy, strscpy and other
>> functions that were introduced?
>>
> 
> Yes, I think that would be advisable. I imagine the easiest way to test
> them is to do as I have here in running comparisons with a range of inputs,
> especially boundary conditions, against a known-good version for platforms
> that have the functions built-in.
> As always, volunteers and patches welcome... :-)

/action hides

> 
> /Bruce
> 


-- 
Thanks,
Anatoly

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [dpdk-dev] [PATCH] eal: support strlcat function
  2019-01-16 12:48 [dpdk-dev] [PATCH] eal: support strlcat function Bruce Richardson
  2019-01-17 10:39 ` Burakov, Anatoly
@ 2019-01-17 13:10 ` Ferruh Yigit
  2019-01-17 16:30 ` [dpdk-dev] [PATCH v2] " Bruce Richardson
  2019-01-17 17:30 ` [dpdk-dev] [PATCH v3] " Bruce Richardson
  3 siblings, 0 replies; 16+ messages in thread
From: Ferruh Yigit @ 2019-01-17 13:10 UTC (permalink / raw)
  To: Bruce Richardson, dev

On 1/16/2019 12:48 PM, Bruce Richardson wrote:
> Add the strlcat function to DPDK to exist alongside the strlcpy one.  While
> strncat is generally safe for use for concatenation, the API for the
> strlcat function is perhaps a little nicer to use, and supports truncation
> detection.
> 
> See commit: 5364de644a4b ("eal: support strlcpy function") for more
> details on the function selection logic, since we only should be using the
> DPDK-provided version when no system-provided version is present.
> 
> Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
> ---
>  .../common/include/rte_string_fns.h           | 15 +++++++
>  test/test/test_string_fns.c                   | 45 +++++++++++++++++++
>  2 files changed, 60 insertions(+)
> 
> diff --git a/lib/librte_eal/common/include/rte_string_fns.h b/lib/librte_eal/common/include/rte_string_fns.h
> index 9a2a1ff90..e7a1656f0 100644
> --- a/lib/librte_eal/common/include/rte_string_fns.h
> +++ b/lib/librte_eal/common/include/rte_string_fns.h
> @@ -59,10 +59,24 @@ rte_strlcpy(char *dst, const char *src, size_t size)
>  	return (size_t)snprintf(dst, size, "%s", src);
>  }
>  
> +/**
> + * @internal
> + * DPDK-specific version of strlcat for systems without
> + * libc or libbsd copies of the function
> + */
> +static inline size_t
> +rte_strlcat(char *dst, const char *src, size_t size)
> +{
> +	size_t l = strnlen(dst, size);
> +	return l + ((l < size) ?
> +		rte_strlcpy(&dst[l], src, size - l) : strlen(src));

I think operation is complex for ternary operation, regular if check can be
simpler, other than that looks good to me.

> +}
> +
>  /* pull in a strlcpy function */
>  #ifdef RTE_EXEC_ENV_BSDAPP
>  #ifndef __BSD_VISIBLE /* non-standard functions are hidden */
>  #define strlcpy(dst, src, size) rte_strlcpy(dst, src, size)
> +#define strlcat(dst, src, size) rte_strlcat(dst, src, size)
>  #endif
>  
>  #else /* non-BSD platforms */
> @@ -71,6 +85,7 @@ rte_strlcpy(char *dst, const char *src, size_t size)
>  
>  #else /* no BSD header files, create own */
>  #define strlcpy(dst, src, size) rte_strlcpy(dst, src, size)
> +#define strlcat(dst, src, size) rte_strlcat(dst, src, size)
>  
>  #endif /* RTE_USE_LIBBSD */
>  #endif /* BSDAPP */
> diff --git a/test/test/test_string_fns.c b/test/test/test_string_fns.c
> index 3f091ab92..3bd8ed5d8 100644
> --- a/test/test/test_string_fns.c
> +++ b/test/test/test_string_fns.c
> @@ -129,11 +129,56 @@ test_rte_strsplit(void)
>  	return 0;
>  }
>  
> +int
> +test_rte_strlcat(void)
> +{
> +	/* only run actual unit tests if we have system-provided strlcat */
> +#if defined(__BSD_VISIBLE) || defined(RTE_USE_LIBBSD)
> +#define BUF_LEN 32
> +	const char dst[BUF_LEN] = "Test string";
> +	const char src[] = " appended";
> +	char bsd_dst[BUF_LEN];
> +	char rte_dst[BUF_LEN];
> +	size_t i, bsd_ret, rte_ret;
> +
> +	LOG("dst = '%s', strlen(dst) = %zu\n", dst, strlen(dst));
> +	LOG("src = '%s', strlen(src) = %zu\n", src, strlen(src));
> +	LOG("---\n");
> +
> +	for (i = 0; i < BUF_LEN; i++) {
> +		/* initialize destination buffers */
> +		memcpy(bsd_dst, dst, BUF_LEN);
> +		memcpy(rte_dst, dst, BUF_LEN);
> +		/* compare implementations */
> +		bsd_ret = strlcat(bsd_dst, src, i);
> +		rte_ret = rte_strlcat(rte_dst, src, i);
> +		if (bsd_ret != rte_ret) {
> +			LOG("Incorrect retval for buf length = %zu\n", i);
> +			LOG("BSD: '%zu', rte: '%zu'\n", bsd_ret, rte_ret);
> +			return -1;
> +		}
> +		if (memcmp(bsd_dst, rte_dst, BUF_LEN) != 0) {
> +			LOG("Resulting buffers don't match\n");
> +			LOG("BSD: '%s', rte: '%s'\n", bsd_dst, rte_dst);
> +			return -1;
> +		}
> +		LOG("buffer size = %zu: dst = '%s', ret = %zu\n",
> +			i, rte_dst, rte_ret);
> +	}
> +	LOG("Checked %zu combinations\n", i);
> +#undef BUF_LEN
> +#endif /* defined(__BSD_VISIBLE) || defined(RTE_USE_LIBBSD) */
> +
> +	return 0;
> +}
> +
>  static int
>  test_string_fns(void)
>  {
>  	if (test_rte_strsplit() < 0)
>  		return -1;
> +	if (test_rte_strlcat() < 0)
> +		return -1;
>  	return 0;
>  }
>  
> 

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [dpdk-dev] [PATCH v2] eal: support strlcat function
  2019-01-16 12:48 [dpdk-dev] [PATCH] eal: support strlcat function Bruce Richardson
  2019-01-17 10:39 ` Burakov, Anatoly
  2019-01-17 13:10 ` Ferruh Yigit
@ 2019-01-17 16:30 ` Bruce Richardson
  2019-01-17 16:50   ` Ferruh Yigit
  2019-01-17 17:05   ` Pattan, Reshma
  2019-01-17 17:30 ` [dpdk-dev] [PATCH v3] " Bruce Richardson
  3 siblings, 2 replies; 16+ messages in thread
From: Bruce Richardson @ 2019-01-17 16:30 UTC (permalink / raw)
  To: dev; +Cc: Bruce Richardson

Add the strlcat function to DPDK to exist alongside the strlcpy one.
While strncat is generally safe for use for concatenation, the API for the
strlcat function is perhaps a little nicer to use, and supports truncation
detection.

See commit: 5364de644a4b ("eal: support strlcpy function") for more
details on the function selection logic, since we only should be using the
DPDK-provided version when no system-provided version is present.

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>

---
V2: place ternary operator with regular if statement for readability
	CC: Ferruh Yigit <ferruh.yigit@intel.com>

---
 .../common/include/rte_string_fns.h           | 16 +++++++
 test/test/test_string_fns.c                   | 45 +++++++++++++++++++
 2 files changed, 61 insertions(+)

diff --git a/lib/librte_eal/common/include/rte_string_fns.h b/lib/librte_eal/common/include/rte_string_fns.h
index 9a2a1ff90..35c6b003c 100644
--- a/lib/librte_eal/common/include/rte_string_fns.h
+++ b/lib/librte_eal/common/include/rte_string_fns.h
@@ -59,10 +59,25 @@ rte_strlcpy(char *dst, const char *src, size_t size)
 	return (size_t)snprintf(dst, size, "%s", src);
 }
 
+/**
+ * @internal
+ * DPDK-specific version of strlcat for systems without
+ * libc or libbsd copies of the function
+ */
+static inline size_t
+rte_strlcat(char *dst, const char *src, size_t size)
+{
+	size_t l = strnlen(dst, size);
+	if (l < size)
+		return l + rte_strlcpy(&dst[l], src, size - l);
+	return l + strlen(src);
+}
+
 /* pull in a strlcpy function */
 #ifdef RTE_EXEC_ENV_BSDAPP
 #ifndef __BSD_VISIBLE /* non-standard functions are hidden */
 #define strlcpy(dst, src, size) rte_strlcpy(dst, src, size)
+#define strlcat(dst, src, size) rte_strlcat(dst, src, size)
 #endif
 
 #else /* non-BSD platforms */
@@ -71,6 +86,7 @@ rte_strlcpy(char *dst, const char *src, size_t size)
 
 #else /* no BSD header files, create own */
 #define strlcpy(dst, src, size) rte_strlcpy(dst, src, size)
+#define strlcat(dst, src, size) rte_strlcat(dst, src, size)
 
 #endif /* RTE_USE_LIBBSD */
 #endif /* BSDAPP */
diff --git a/test/test/test_string_fns.c b/test/test/test_string_fns.c
index 3f091ab92..3bd8ed5d8 100644
--- a/test/test/test_string_fns.c
+++ b/test/test/test_string_fns.c
@@ -129,11 +129,56 @@ test_rte_strsplit(void)
 	return 0;
 }
 
+int
+test_rte_strlcat(void)
+{
+	/* only run actual unit tests if we have system-provided strlcat */
+#if defined(__BSD_VISIBLE) || defined(RTE_USE_LIBBSD)
+#define BUF_LEN 32
+	const char dst[BUF_LEN] = "Test string";
+	const char src[] = " appended";
+	char bsd_dst[BUF_LEN];
+	char rte_dst[BUF_LEN];
+	size_t i, bsd_ret, rte_ret;
+
+	LOG("dst = '%s', strlen(dst) = %zu\n", dst, strlen(dst));
+	LOG("src = '%s', strlen(src) = %zu\n", src, strlen(src));
+	LOG("---\n");
+
+	for (i = 0; i < BUF_LEN; i++) {
+		/* initialize destination buffers */
+		memcpy(bsd_dst, dst, BUF_LEN);
+		memcpy(rte_dst, dst, BUF_LEN);
+		/* compare implementations */
+		bsd_ret = strlcat(bsd_dst, src, i);
+		rte_ret = rte_strlcat(rte_dst, src, i);
+		if (bsd_ret != rte_ret) {
+			LOG("Incorrect retval for buf length = %zu\n", i);
+			LOG("BSD: '%zu', rte: '%zu'\n", bsd_ret, rte_ret);
+			return -1;
+		}
+		if (memcmp(bsd_dst, rte_dst, BUF_LEN) != 0) {
+			LOG("Resulting buffers don't match\n");
+			LOG("BSD: '%s', rte: '%s'\n", bsd_dst, rte_dst);
+			return -1;
+		}
+		LOG("buffer size = %zu: dst = '%s', ret = %zu\n",
+			i, rte_dst, rte_ret);
+	}
+	LOG("Checked %zu combinations\n", i);
+#undef BUF_LEN
+#endif /* defined(__BSD_VISIBLE) || defined(RTE_USE_LIBBSD) */
+
+	return 0;
+}
+
 static int
 test_string_fns(void)
 {
 	if (test_rte_strsplit() < 0)
 		return -1;
+	if (test_rte_strlcat() < 0)
+		return -1;
 	return 0;
 }
 
-- 
2.20.1

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [dpdk-dev] [PATCH v2] eal: support strlcat function
  2019-01-17 16:30 ` [dpdk-dev] [PATCH v2] " Bruce Richardson
@ 2019-01-17 16:50   ` Ferruh Yigit
  2019-01-17 17:05   ` Pattan, Reshma
  1 sibling, 0 replies; 16+ messages in thread
From: Ferruh Yigit @ 2019-01-17 16:50 UTC (permalink / raw)
  To: Bruce Richardson, dev

On 1/17/2019 4:30 PM, Bruce Richardson wrote:
> Add the strlcat function to DPDK to exist alongside the strlcpy one.
> While strncat is generally safe for use for concatenation, the API for the
> strlcat function is perhaps a little nicer to use, and supports truncation
> detection.
> 
> See commit: 5364de644a4b ("eal: support strlcpy function") for more
> details on the function selection logic, since we only should be using the
> DPDK-provided version when no system-provided version is present.
> 
> Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>

Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [dpdk-dev] [PATCH v2] eal: support strlcat function
  2019-01-17 16:30 ` [dpdk-dev] [PATCH v2] " Bruce Richardson
  2019-01-17 16:50   ` Ferruh Yigit
@ 2019-01-17 17:05   ` Pattan, Reshma
  1 sibling, 0 replies; 16+ messages in thread
From: Pattan, Reshma @ 2019-01-17 17:05 UTC (permalink / raw)
  To: Richardson, Bruce, dev; +Cc: Richardson, Bruce



> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Bruce Richardson
> 3f091ab92..3bd8ed5d8 100644
> --- a/test/test/test_string_fns.c
> +++ b/test/test/test_string_fns.c
> @@ -129,11 +129,56 @@ test_rte_strsplit(void)
>  	return 0;
>  }
> 
> +int
> +test_rte_strlcat(void)
> +{


test_string_fns.c:133:1: error: no previous prototype for 'test_rte_strlcat' [-Werror=missing-prototypes]
 test_rte_strlcat(void)
 ^~~~~~~~~~~~~~~~
cc1: all warnings being treated as errors

function return type should be static int.

Thanks,
Reshma

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [dpdk-dev] [PATCH v3] eal: support strlcat function
  2019-01-16 12:48 [dpdk-dev] [PATCH] eal: support strlcat function Bruce Richardson
                   ` (2 preceding siblings ...)
  2019-01-17 16:30 ` [dpdk-dev] [PATCH v2] " Bruce Richardson
@ 2019-01-17 17:30 ` Bruce Richardson
  2019-02-12  9:27   ` Thomas Monjalon
  2019-04-16 14:29   ` Kevin Traynor
  3 siblings, 2 replies; 16+ messages in thread
From: Bruce Richardson @ 2019-01-17 17:30 UTC (permalink / raw)
  To: dev; +Cc: Bruce Richardson, Ferruh Yigit, Reshma Pattan

Add the strlcat function to DPDK to exist alongside the strlcpy one.
While strncat is generally safe for use for concatenation, the API for the
strlcat function is perhaps a little nicer to use, and supports truncation
detection.

See commit 5364de644a4b ("eal: support strlcpy function") for more
details on the function selection logic, since we only should be using the
DPDK-provided version when no system-provided version is present.

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>

---
V3: fix compiler error by making the test function static
CC: Reshma Pattan <reshma.pattan@intel.com>

V2: place ternary operator with regular if statement for readability
CC: Ferruh Yigit <ferruh.yigit@intel.com>
---
 .../common/include/rte_string_fns.h           | 16 +++++++
 test/test/test_string_fns.c                   | 45 +++++++++++++++++++
 2 files changed, 61 insertions(+)

diff --git a/lib/librte_eal/common/include/rte_string_fns.h b/lib/librte_eal/common/include/rte_string_fns.h
index 9a2a1ff90..35c6b003c 100644
--- a/lib/librte_eal/common/include/rte_string_fns.h
+++ b/lib/librte_eal/common/include/rte_string_fns.h
@@ -59,10 +59,25 @@ rte_strlcpy(char *dst, const char *src, size_t size)
 	return (size_t)snprintf(dst, size, "%s", src);
 }
 
+/**
+ * @internal
+ * DPDK-specific version of strlcat for systems without
+ * libc or libbsd copies of the function
+ */
+static inline size_t
+rte_strlcat(char *dst, const char *src, size_t size)
+{
+	size_t l = strnlen(dst, size);
+	if (l < size)
+		return l + rte_strlcpy(&dst[l], src, size - l);
+	return l + strlen(src);
+}
+
 /* pull in a strlcpy function */
 #ifdef RTE_EXEC_ENV_BSDAPP
 #ifndef __BSD_VISIBLE /* non-standard functions are hidden */
 #define strlcpy(dst, src, size) rte_strlcpy(dst, src, size)
+#define strlcat(dst, src, size) rte_strlcat(dst, src, size)
 #endif
 
 #else /* non-BSD platforms */
@@ -71,6 +86,7 @@ rte_strlcpy(char *dst, const char *src, size_t size)
 
 #else /* no BSD header files, create own */
 #define strlcpy(dst, src, size) rte_strlcpy(dst, src, size)
+#define strlcat(dst, src, size) rte_strlcat(dst, src, size)
 
 #endif /* RTE_USE_LIBBSD */
 #endif /* BSDAPP */
diff --git a/test/test/test_string_fns.c b/test/test/test_string_fns.c
index 3f091ab92..5e105d2bb 100644
--- a/test/test/test_string_fns.c
+++ b/test/test/test_string_fns.c
@@ -129,11 +129,56 @@ test_rte_strsplit(void)
 	return 0;
 }
 
+static int
+test_rte_strlcat(void)
+{
+	/* only run actual unit tests if we have system-provided strlcat */
+#if defined(__BSD_VISIBLE) || defined(RTE_USE_LIBBSD)
+#define BUF_LEN 32
+	const char dst[BUF_LEN] = "Test string";
+	const char src[] = " appended";
+	char bsd_dst[BUF_LEN];
+	char rte_dst[BUF_LEN];
+	size_t i, bsd_ret, rte_ret;
+
+	LOG("dst = '%s', strlen(dst) = %zu\n", dst, strlen(dst));
+	LOG("src = '%s', strlen(src) = %zu\n", src, strlen(src));
+	LOG("---\n");
+
+	for (i = 0; i < BUF_LEN; i++) {
+		/* initialize destination buffers */
+		memcpy(bsd_dst, dst, BUF_LEN);
+		memcpy(rte_dst, dst, BUF_LEN);
+		/* compare implementations */
+		bsd_ret = strlcat(bsd_dst, src, i);
+		rte_ret = rte_strlcat(rte_dst, src, i);
+		if (bsd_ret != rte_ret) {
+			LOG("Incorrect retval for buf length = %zu\n", i);
+			LOG("BSD: '%zu', rte: '%zu'\n", bsd_ret, rte_ret);
+			return -1;
+		}
+		if (memcmp(bsd_dst, rte_dst, BUF_LEN) != 0) {
+			LOG("Resulting buffers don't match\n");
+			LOG("BSD: '%s', rte: '%s'\n", bsd_dst, rte_dst);
+			return -1;
+		}
+		LOG("buffer size = %zu: dst = '%s', ret = %zu\n",
+			i, rte_dst, rte_ret);
+	}
+	LOG("Checked %zu combinations\n", i);
+#undef BUF_LEN
+#endif /* defined(__BSD_VISIBLE) || defined(RTE_USE_LIBBSD) */
+
+	return 0;
+}
+
 static int
 test_string_fns(void)
 {
 	if (test_rte_strsplit() < 0)
 		return -1;
+	if (test_rte_strlcat() < 0)
+		return -1;
 	return 0;
 }
 
-- 
2.20.1

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [dpdk-dev] [PATCH v3] eal: support strlcat function
  2019-01-17 17:30 ` [dpdk-dev] [PATCH v3] " Bruce Richardson
@ 2019-02-12  9:27   ` Thomas Monjalon
  2019-04-16 14:29   ` Kevin Traynor
  1 sibling, 0 replies; 16+ messages in thread
From: Thomas Monjalon @ 2019-02-12  9:27 UTC (permalink / raw)
  To: Bruce Richardson; +Cc: dev, Ferruh Yigit, Reshma Pattan

17/01/2019 18:30, Bruce Richardson:
> Add the strlcat function to DPDK to exist alongside the strlcpy one.
> While strncat is generally safe for use for concatenation, the API for the
> strlcat function is perhaps a little nicer to use, and supports truncation
> detection.
> 
> See commit 5364de644a4b ("eal: support strlcpy function") for more
> details on the function selection logic, since we only should be using the
> DPDK-provided version when no system-provided version is present.
> 
> Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
> Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>

Applied, thanks

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [dpdk-dev] [PATCH v3] eal: support strlcat function
  2019-01-17 17:30 ` [dpdk-dev] [PATCH v3] " Bruce Richardson
  2019-02-12  9:27   ` Thomas Monjalon
@ 2019-04-16 14:29   ` Kevin Traynor
  2019-04-16 14:29     ` Kevin Traynor
  2019-04-16 14:37     ` Bruce Richardson
  1 sibling, 2 replies; 16+ messages in thread
From: Kevin Traynor @ 2019-04-16 14:29 UTC (permalink / raw)
  To: Bruce Richardson, dev; +Cc: Ferruh Yigit, Reshma Pattan, stable

On 17/01/2019 17:30, Bruce Richardson wrote:
> Add the strlcat function to DPDK to exist alongside the strlcpy one.
> While strncat is generally safe for use for concatenation, the API for the
> strlcat function is perhaps a little nicer to use, and supports truncation
> detection.
> 
> See commit 5364de644a4b ("eal: support strlcpy function") for more
> details on the function selection logic, since we only should be using the
> DPDK-provided version when no system-provided version is present.
> 
> Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
> Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>

Hi - I'd like to backport this to 18.11 stable branch. Not having it is
starting to cause build failures with backports. Let me know if any
objection.

thanks,
Kevin.

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [dpdk-dev] [PATCH v3] eal: support strlcat function
  2019-04-16 14:29   ` Kevin Traynor
@ 2019-04-16 14:29     ` Kevin Traynor
  2019-04-16 14:37     ` Bruce Richardson
  1 sibling, 0 replies; 16+ messages in thread
From: Kevin Traynor @ 2019-04-16 14:29 UTC (permalink / raw)
  To: Bruce Richardson, dev; +Cc: Ferruh Yigit, Reshma Pattan, stable

On 17/01/2019 17:30, Bruce Richardson wrote:
> Add the strlcat function to DPDK to exist alongside the strlcpy one.
> While strncat is generally safe for use for concatenation, the API for the
> strlcat function is perhaps a little nicer to use, and supports truncation
> detection.
> 
> See commit 5364de644a4b ("eal: support strlcpy function") for more
> details on the function selection logic, since we only should be using the
> DPDK-provided version when no system-provided version is present.
> 
> Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
> Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>

Hi - I'd like to backport this to 18.11 stable branch. Not having it is
starting to cause build failures with backports. Let me know if any
objection.

thanks,
Kevin.

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [dpdk-dev] [PATCH v3] eal: support strlcat function
  2019-04-16 14:29   ` Kevin Traynor
  2019-04-16 14:29     ` Kevin Traynor
@ 2019-04-16 14:37     ` Bruce Richardson
  2019-04-16 14:37       ` Bruce Richardson
  2019-04-16 16:03       ` Ferruh Yigit
  1 sibling, 2 replies; 16+ messages in thread
From: Bruce Richardson @ 2019-04-16 14:37 UTC (permalink / raw)
  To: Kevin Traynor; +Cc: dev, Ferruh Yigit, Reshma Pattan, stable

On Tue, Apr 16, 2019 at 03:29:52PM +0100, Kevin Traynor wrote:
> On 17/01/2019 17:30, Bruce Richardson wrote:
> > Add the strlcat function to DPDK to exist alongside the strlcpy one.
> > While strncat is generally safe for use for concatenation, the API for the
> > strlcat function is perhaps a little nicer to use, and supports truncation
> > detection.
> > 
> > See commit 5364de644a4b ("eal: support strlcpy function") for more
> > details on the function selection logic, since we only should be using the
> > DPDK-provided version when no system-provided version is present.
> > 
> > Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
> > Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>
> 
> Hi - I'd like to backport this to 18.11 stable branch. Not having it is
> starting to cause build failures with backports. Let me know if any
> objection.
> 
Go for it! No objections here, I think it makes sense.

/Bruce

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [dpdk-dev] [PATCH v3] eal: support strlcat function
  2019-04-16 14:37     ` Bruce Richardson
@ 2019-04-16 14:37       ` Bruce Richardson
  2019-04-16 16:03       ` Ferruh Yigit
  1 sibling, 0 replies; 16+ messages in thread
From: Bruce Richardson @ 2019-04-16 14:37 UTC (permalink / raw)
  To: Kevin Traynor; +Cc: dev, Ferruh Yigit, Reshma Pattan, stable

On Tue, Apr 16, 2019 at 03:29:52PM +0100, Kevin Traynor wrote:
> On 17/01/2019 17:30, Bruce Richardson wrote:
> > Add the strlcat function to DPDK to exist alongside the strlcpy one.
> > While strncat is generally safe for use for concatenation, the API for the
> > strlcat function is perhaps a little nicer to use, and supports truncation
> > detection.
> > 
> > See commit 5364de644a4b ("eal: support strlcpy function") for more
> > details on the function selection logic, since we only should be using the
> > DPDK-provided version when no system-provided version is present.
> > 
> > Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
> > Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>
> 
> Hi - I'd like to backport this to 18.11 stable branch. Not having it is
> starting to cause build failures with backports. Let me know if any
> objection.
> 
Go for it! No objections here, I think it makes sense.

/Bruce

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [dpdk-dev] [PATCH v3] eal: support strlcat function
  2019-04-16 14:37     ` Bruce Richardson
  2019-04-16 14:37       ` Bruce Richardson
@ 2019-04-16 16:03       ` Ferruh Yigit
  2019-04-16 16:03         ` Ferruh Yigit
  1 sibling, 1 reply; 16+ messages in thread
From: Ferruh Yigit @ 2019-04-16 16:03 UTC (permalink / raw)
  To: Bruce Richardson, Kevin Traynor; +Cc: dev, Reshma Pattan, stable

On 4/16/2019 3:37 PM, Bruce Richardson wrote:
> On Tue, Apr 16, 2019 at 03:29:52PM +0100, Kevin Traynor wrote:
>> On 17/01/2019 17:30, Bruce Richardson wrote:
>>> Add the strlcat function to DPDK to exist alongside the strlcpy one.
>>> While strncat is generally safe for use for concatenation, the API for the
>>> strlcat function is perhaps a little nicer to use, and supports truncation
>>> detection.
>>>
>>> See commit 5364de644a4b ("eal: support strlcpy function") for more
>>> details on the function selection logic, since we only should be using the
>>> DPDK-provided version when no system-provided version is present.
>>>
>>> Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
>>> Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>
>>
>> Hi - I'd like to backport this to 18.11 stable branch. Not having it is
>> starting to cause build failures with backports. Let me know if any
>> objection.
>>
> Go for it! No objections here, I think it makes sense.

+1 for the backport.

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [dpdk-dev] [PATCH v3] eal: support strlcat function
  2019-04-16 16:03       ` Ferruh Yigit
@ 2019-04-16 16:03         ` Ferruh Yigit
  0 siblings, 0 replies; 16+ messages in thread
From: Ferruh Yigit @ 2019-04-16 16:03 UTC (permalink / raw)
  To: Bruce Richardson, Kevin Traynor; +Cc: dev, Reshma Pattan, stable

On 4/16/2019 3:37 PM, Bruce Richardson wrote:
> On Tue, Apr 16, 2019 at 03:29:52PM +0100, Kevin Traynor wrote:
>> On 17/01/2019 17:30, Bruce Richardson wrote:
>>> Add the strlcat function to DPDK to exist alongside the strlcpy one.
>>> While strncat is generally safe for use for concatenation, the API for the
>>> strlcat function is perhaps a little nicer to use, and supports truncation
>>> detection.
>>>
>>> See commit 5364de644a4b ("eal: support strlcpy function") for more
>>> details on the function selection logic, since we only should be using the
>>> DPDK-provided version when no system-provided version is present.
>>>
>>> Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
>>> Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>
>>
>> Hi - I'd like to backport this to 18.11 stable branch. Not having it is
>> starting to cause build failures with backports. Let me know if any
>> objection.
>>
> Go for it! No objections here, I think it makes sense.

+1 for the backport.

^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2019-04-16 16:03 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-01-16 12:48 [dpdk-dev] [PATCH] eal: support strlcat function Bruce Richardson
2019-01-17 10:39 ` Burakov, Anatoly
2019-01-17 11:00   ` Bruce Richardson
2019-01-17 11:55     ` Burakov, Anatoly
2019-01-17 13:10 ` Ferruh Yigit
2019-01-17 16:30 ` [dpdk-dev] [PATCH v2] " Bruce Richardson
2019-01-17 16:50   ` Ferruh Yigit
2019-01-17 17:05   ` Pattan, Reshma
2019-01-17 17:30 ` [dpdk-dev] [PATCH v3] " Bruce Richardson
2019-02-12  9:27   ` Thomas Monjalon
2019-04-16 14:29   ` Kevin Traynor
2019-04-16 14:29     ` Kevin Traynor
2019-04-16 14:37     ` Bruce Richardson
2019-04-16 14:37       ` Bruce Richardson
2019-04-16 16:03       ` Ferruh Yigit
2019-04-16 16:03         ` Ferruh Yigit

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).