[dpdk-dev] [RFC PATCH] use strlcpy for string copies

Matteo Croce mcroce at redhat.com
Fri Feb 23 19:11:53 CET 2018


On Tue, Feb 20, 2018 at 6:07 PM, Bruce Richardson
<bruce.richardson at intel.com> wrote:
> Following on from the number of patches needing to be done for strncpy
> issues highlighted by coverity...
>
> The strncpy function is error prone for doing "safe" string copies, so
> we generally try to use "snprintf" instead in the code. The function
> "strlcpy" is a better alternative, though, since it better conveys the
> intention of the programmer, and doesn't suffer from the non-null
> terminating behaviour of it's n'ed brethern.
>
> The downside of this function is that it is not available by default
> on linux, though standard in the BSD's. It is available on most
> distros by installing "libbsd" package.
>
> This RFC therefore provides the following in rte_string_fns.h to ensure
> that strlcpy is available there:
> * for BSD, include string.h as normal
> * if RTE_USE_LIBBSD is set, include <bsd/string.h>
> * if not set, fallback to snprintf for strlcpy
>
> Using make build system, the RTE_USE_LIBBSD is a hard-coded value to "n",
> but when using meson, it's automatically set based on what is available
> on the platform.
>
> Instances of snprintf using "%s" alone as a string format are replaced
> via coccinelle script with the new strlcpy function. Instances of
> strncpy should be replaced too, but requires manual checking as to
> whether the NULL termination is manually done afterward or not.
>
> Signed-off-by: Bruce Richardson <bruce.richardson at intel.com>
> ---
>  app/pdump/main.c                                           | 11 +++++------
>  app/test-pmd/parameters.c                                  |  5 ++---
>  config/common_base                                         |  1 +
>  config/meson.build                                         |  7 +++++++
>  devtools/cocci/strlcpy.cocci                               |  8 ++++++++
>  drivers/net/bonding/rte_eth_bond_pmd.c                     |  2 +-
>  drivers/net/failsafe/failsafe_args.c                       |  5 +++--
>  drivers/net/mlx4/mlx4_ethdev.c                             |  2 +-
>  drivers/net/mlx5/mlx5_ethdev.c                             |  2 +-
>  drivers/net/mrvl/mrvl_qos.c                                |  2 +-
>  drivers/net/tap/rte_eth_tap.c                              |  5 +++--
>  .../ip_pipeline/pipeline/pipeline_flow_classification_be.c |  4 ++--
>  examples/ip_pipeline/pipeline/pipeline_passthrough_be.c    |  4 ++--
>  examples/load_balancer/config.c                            |  2 +-
>  lib/librte_cmdline/cmdline_parse.c                         |  6 +++---
>  lib/librte_cmdline/cmdline_parse_etheraddr.c               |  2 +-
>  lib/librte_cmdline/cmdline_parse_ipaddr.c                  |  2 +-
>  lib/librte_cmdline/cmdline_parse_portlist.c                |  2 +-
>  lib/librte_cmdline/cmdline_parse_string.c                  |  4 ++--
>  lib/librte_eal/common/eal_common_bus.c                     |  3 ++-
>  lib/librte_eal/common/include/rte_string_fns.h             | 14 ++++++++++++++
>  lib/librte_pdump/rte_pdump.c                               |  9 +++++----
>  test/test/test_cmdline_cirbuf.c                            |  2 +-
>  test/test/test_eal_flags.c                                 | 10 ++++++----
>  test/test/test_malloc.c                                    |  2 +-
>  25 files changed, 75 insertions(+), 41 deletions(-)
>  create mode 100644 devtools/cocci/strlcpy.cocci
>
> diff --git a/app/pdump/main.c b/app/pdump/main.c
> index f6865bdbd..d29de0321 100644
> --- a/app/pdump/main.c
> +++ b/app/pdump/main.c
> @@ -24,6 +24,7 @@
>  #include <rte_kvargs.h>
>  #include <rte_mempool.h>
>  #include <rte_ring.h>
> +#include <rte_string_fns.h>
>  #include <rte_pdump.h>
>
>  #define CMD_LINE_OPT_PDUMP "pdump"
> @@ -408,17 +409,15 @@ launch_args_parse(int argc, char **argv, char *prgname)
>                         if (!strncmp(long_option[option_index].name,
>                                         CMD_LINE_OPT_SER_SOCK_PATH,
>                                         sizeof(CMD_LINE_OPT_SER_SOCK_PATH))) {
> -                               snprintf(server_socket_path,
> -                                       sizeof(server_socket_path), "%s",
> -                                       optarg);
> +                               strlcpy(server_socket_path, optarg,
> +                                       sizeof(server_socket_path));
>                         }
>
>                         if (!strncmp(long_option[option_index].name,
>                                         CMD_LINE_OPT_CLI_SOCK_PATH,
>                                         sizeof(CMD_LINE_OPT_CLI_SOCK_PATH))) {
> -                               snprintf(client_socket_path,
> -                                       sizeof(client_socket_path), "%s",
> -                                       optarg);
> +                               strlcpy(client_socket_path, optarg,
> +                                       sizeof(client_socket_path));
>                         }
>
>                         break;
> diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c
> index 97d22b860..2192bdcdf 100644
> --- a/app/test-pmd/parameters.c
> +++ b/app/test-pmd/parameters.c
> @@ -658,9 +658,8 @@ launch_args_parse(int argc, char** argv)
>                         if (!strcmp(lgopts[opt_idx].name, "cmdline-file")) {
>                                 printf("CLI commands to be read from %s\n",
>                                        optarg);
> -                               snprintf(cmdline_filename,
> -                                        sizeof(cmdline_filename), "%s",
> -                                        optarg);
> +                               strlcpy(cmdline_filename, optarg,
> +                                       sizeof(cmdline_filename));
>                         }
>                         if (!strcmp(lgopts[opt_idx].name, "auto-start")) {
>                                 printf("Auto-start selected\n");
> diff --git a/config/common_base b/config/common_base
> index ad03cf433..20d4cbcf2 100644
> --- a/config/common_base
> +++ b/config/common_base
> @@ -76,6 +76,7 @@ CONFIG_RTE_EAL_VFIO=n
>  CONFIG_RTE_MAX_VFIO_GROUPS=64
>  CONFIG_RTE_MALLOC_DEBUG=n
>  CONFIG_RTE_EAL_NUMA_AWARE_HUGEPAGES=n
> +CONFIG_RTE_USE_LIBBSD=n
>
>  #
>  # Recognize/ignore the AVX/AVX512 CPU flags for performance/power testing.
> diff --git a/config/meson.build b/config/meson.build
> index f8c67578d..77af5d897 100644
> --- a/config/meson.build
> +++ b/config/meson.build
> @@ -38,6 +38,13 @@ if numa_dep.found() and cc.has_header('numaif.h')
>         dpdk_extra_ldflags += '-lnuma'
>  endif
>
> +# check for strlcpy
> +if host_machine.system() == 'linux' and cc.find_library('bsd', required: false).found()
> +       dpdk_conf.set('RTE_USE_LIBBSD', 1)
> +       add_project_link_arguments('-lbsd', language: 'c')
> +       dpdk_extra_ldflags += '-lbsd'
> +endif
> +
>  # add -include rte_config to cflags
>  add_project_arguments('-include', 'rte_config.h', language: 'c')
>
> diff --git a/devtools/cocci/strlcpy.cocci b/devtools/cocci/strlcpy.cocci
> new file mode 100644
> index 000000000..335e27128
> --- /dev/null
> +++ b/devtools/cocci/strlcpy.cocci
> @@ -0,0 +1,8 @@
> + at use_strlcpy@
> +identifier src, dst;
> +expression size;
> +@@
> +(
> +- snprintf(dst, size, "%s", src)
> ++ strlcpy(dst, src, size)
> +)
> diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c
> index c34c3251f..f958ece72 100644
> --- a/drivers/net/bonding/rte_eth_bond_pmd.c
> +++ b/drivers/net/bonding/rte_eth_bond_pmd.c
> @@ -617,7 +617,7 @@ mode6_debug(const char __attribute__((unused)) *info, struct ether_hdr *eth_h,
>         uint16_t offset = get_vlan_offset(eth_h, &ether_type);
>
>  #ifdef RTE_LIBRTE_BOND_DEBUG_ALB
> -       snprintf(buf, 16, "%s", info);
> +       strlcpy(buf, info, 16);
>  #endif
>
>         if (ether_type == rte_cpu_to_be_16(ETHER_TYPE_IPv4)) {
> diff --git a/drivers/net/failsafe/failsafe_args.c b/drivers/net/failsafe/failsafe_args.c
> index 366dbea16..ea934f92a 100644
> --- a/drivers/net/failsafe/failsafe_args.c
> +++ b/drivers/net/failsafe/failsafe_args.c
> @@ -14,6 +14,7 @@
>  #include <rte_devargs.h>
>  #include <rte_malloc.h>
>  #include <rte_kvargs.h>
> +#include <rte_string_fns.h>
>
>  #include "failsafe_private.h"
>
> @@ -340,7 +341,7 @@ fs_remove_sub_devices_definition(char params[DEVARGS_MAXLEN])
>                 a = b + 1;
>         }
>  out:
> -       snprintf(params, DEVARGS_MAXLEN, "%s", buffer);
> +       strlcpy(params, buffer, DEVARGS_MAXLEN);
>         return 0;
>  }
>
> @@ -392,7 +393,7 @@ failsafe_args_parse(struct rte_eth_dev *dev, const char *params)
>         ret = 0;
>         priv->subs_tx = FAILSAFE_MAX_ETHPORTS;
>         /* default parameters */
> -       n = snprintf(mut_params, sizeof(mut_params), "%s", params);
> +       n = strlcpy(mut_params, params, sizeof(mut_params));
>         if (n >= sizeof(mut_params)) {
>                 ERROR("Parameter string too long (>=%zu)",
>                                 sizeof(mut_params));
> diff --git a/drivers/net/mlx4/mlx4_ethdev.c b/drivers/net/mlx4/mlx4_ethdev.c
> index 3bc692731..c92dd6d43 100644
> --- a/drivers/net/mlx4/mlx4_ethdev.c
> +++ b/drivers/net/mlx4/mlx4_ethdev.c
> @@ -120,7 +120,7 @@ mlx4_get_ifname(const struct priv *priv, char (*ifname)[IF_NAMESIZE])
>                         goto try_dev_id;
>                 dev_port_prev = dev_port;
>                 if (dev_port == (priv->port - 1u))
> -                       snprintf(match, sizeof(match), "%s", name);
> +                       strlcpy(match, name, sizeof(match));
>         }
>         closedir(dir);
>         if (match[0] == '\0') {
> diff --git a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c
> index 666507691..894a045ec 100644
> --- a/drivers/net/mlx5/mlx5_ethdev.c
> +++ b/drivers/net/mlx5/mlx5_ethdev.c
> @@ -163,7 +163,7 @@ priv_get_ifname(const struct priv *priv, char (*ifname)[IF_NAMESIZE])
>                         goto try_dev_id;
>                 dev_port_prev = dev_port;
>                 if (dev_port == (priv->port - 1u))
> -                       snprintf(match, sizeof(match), "%s", name);
> +                       strlcpy(match, name, sizeof(match));
>         }
>         closedir(dir);
>         if (match[0] == '\0')
> diff --git a/drivers/net/mrvl/mrvl_qos.c b/drivers/net/mrvl/mrvl_qos.c
> index fbb368131..edc4d92d6 100644
> --- a/drivers/net/mrvl/mrvl_qos.c
> +++ b/drivers/net/mrvl/mrvl_qos.c
> @@ -190,7 +190,7 @@ get_entry_values(const char *entry, uint8_t *tab,
>                 return -1;
>
>         /* Copy the entry to safely use rte_strsplit(). */
> -       snprintf(entry_cpy, RTE_DIM(entry_cpy), "%s", entry);
> +       strlcpy(entry_cpy, entry, RTE_DIM(entry_cpy));
>
>         /*
>          * If there are more tokens than array size, rte_strsplit will
> diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c
> index f09db0ea9..fbba9aa63 100644
> --- a/drivers/net/tap/rte_eth_tap.c
> +++ b/drivers/net/tap/rte_eth_tap.c
> @@ -15,6 +15,7 @@
>  #include <rte_net.h>
>  #include <rte_debug.h>
>  #include <rte_ip.h>
> +#include <rte_string_fns.h>
>
>  #include <sys/types.h>
>  #include <sys/stat.h>
> @@ -1548,7 +1549,7 @@ set_interface_name(const char *key __rte_unused,
>         char *name = (char *)extra_args;
>
>         if (value)
> -               snprintf(name, RTE_ETH_NAME_MAX_LEN - 1, "%s", value);
> +               strlcpy(name, value, RTE_ETH_NAME_MAX_LEN - 1);
>         else
>                 snprintf(name, RTE_ETH_NAME_MAX_LEN - 1, "%s%d",
>                          DEFAULT_TAP_NAME, (tap_unit - 1));
> @@ -1564,7 +1565,7 @@ set_remote_iface(const char *key __rte_unused,
>         char *name = (char *)extra_args;
>
>         if (value)
> -               snprintf(name, RTE_ETH_NAME_MAX_LEN, "%s", value);
> +               strlcpy(name, value, RTE_ETH_NAME_MAX_LEN);
>
>         return 0;
>  }
> diff --git a/examples/ip_pipeline/pipeline/pipeline_flow_classification_be.c b/examples/ip_pipeline/pipeline/pipeline_flow_classification_be.c
> index 097ec3469..3e26ae86b 100644
> --- a/examples/ip_pipeline/pipeline/pipeline_flow_classification_be.c
> +++ b/examples/ip_pipeline/pipeline/pipeline_flow_classification_be.c
> @@ -8,6 +8,7 @@
>  #include <rte_malloc.h>
>  #include <rte_table_hash.h>
>  #include <rte_byteorder.h>
> +#include <rte_string_fns.h>
>  #include <pipeline.h>
>
>  #include "pipeline_flow_classification_be.h"
> @@ -280,8 +281,7 @@ pipeline_fc_parse_args(struct pipeline_flow_classification *p,
>                                 "\"%s\" is too long", params->name,
>                                 arg_name);
>
> -                       snprintf(key_mask_str, mask_str_len + 1, "%s",
> -                               arg_value);
> +                       strlcpy(key_mask_str, arg_value, mask_str_len + 1);
>
>                         continue;
>                 }
> diff --git a/examples/ip_pipeline/pipeline/pipeline_passthrough_be.c b/examples/ip_pipeline/pipeline/pipeline_passthrough_be.c
> index b2bbaedda..1c44e75df 100644
> --- a/examples/ip_pipeline/pipeline/pipeline_passthrough_be.c
> +++ b/examples/ip_pipeline/pipeline/pipeline_passthrough_be.c
> @@ -8,6 +8,7 @@
>  #include <rte_common.h>
>  #include <rte_malloc.h>
>  #include <rte_byteorder.h>
> +#include <rte_string_fns.h>
>  #include <rte_table_stub.h>
>  #include <rte_table_hash.h>
>  #include <rte_pipeline.h>
> @@ -524,8 +525,7 @@ pipeline_passthrough_parse_args(struct pipeline_passthrough_params *p,
>                                 "\"%s\" too long", params->name,
>                                 arg_name);
>
> -                       snprintf(dma_mask_str, mask_str_len + 1,
> -                               "%s", arg_value);
> +                       strlcpy(dma_mask_str, arg_value, mask_str_len + 1);
>
>                         p->dma_enabled = 1;
>
> diff --git a/examples/load_balancer/config.c b/examples/load_balancer/config.c
> index b5b66368d..972c85c5b 100644
> --- a/examples/load_balancer/config.c
> +++ b/examples/load_balancer/config.c
> @@ -121,7 +121,7 @@ str_to_unsigned_array(
>         int i, num_splits = 0;
>
>         /* copy s so we don't modify original string */
> -       snprintf(str, sizeof(str), "%s", s);
> +       strlcpy(str, s, sizeof(str));
>         num_splits = rte_strsplit(str, sizeof(str), splits, num_vals, separator);
>
>         errno = 0;
> diff --git a/lib/librte_cmdline/cmdline_parse.c b/lib/librte_cmdline/cmdline_parse.c
> index e88e4e110..961f9befd 100644
> --- a/lib/librte_cmdline/cmdline_parse.c
> +++ b/lib/librte_cmdline/cmdline_parse.c
> @@ -251,7 +251,7 @@ cmdline_parse(struct cmdline *cl, const char * buf)
>         }
>
>  #ifdef RTE_LIBRTE_CMDLINE_DEBUG
> -       snprintf(debug_buf, (linelen>64 ? 64 : linelen), "%s", buf);
> +       strlcpy(debug_buf, buf, (linelen > 64 ? 64 : linelen));
>         debug_printf("Parse line : len=%d, <%s>\n", linelen, debug_buf);
>  #endif
>
> @@ -436,7 +436,7 @@ cmdline_complete(struct cmdline *cl, const char *buf, int *state,
>                                 if ((unsigned)(comp_len + 1) > size)
>                                         return 0;
>
> -                               snprintf(dst, size, "%s", comp_buf);
> +                               strlcpy(dst, comp_buf, size);
>                                 dst[comp_len] = 0;
>                                 return 2;
>                         }
> @@ -513,7 +513,7 @@ cmdline_complete(struct cmdline *cl, const char *buf, int *state,
>                                         continue;
>                                 }
>                                 (*state)++;
> -                               l=snprintf(dst, size, "%s", tmpbuf);
> +                               l=strlcpy(dst, tmpbuf, size);
>                                 if (l>=0 && token_hdr.ops->get_help) {
>                                         token_hdr.ops->get_help(token_p, tmpbuf,
>                                                                 sizeof(tmpbuf));
> diff --git a/lib/librte_cmdline/cmdline_parse_etheraddr.c b/lib/librte_cmdline/cmdline_parse_etheraddr.c
> index 8d2811926..24e04755c 100644
> --- a/lib/librte_cmdline/cmdline_parse_etheraddr.c
> +++ b/lib/librte_cmdline/cmdline_parse_etheraddr.c
> @@ -102,7 +102,7 @@ cmdline_parse_etheraddr(__attribute__((unused)) cmdline_parse_token_hdr_t *tk,
>                         (token_len != ETHER_ADDRSTRLENSHORT - 1))
>                 return -1;
>
> -       snprintf(ether_str, token_len+1, "%s", buf);
> +       strlcpy(ether_str, buf, token_len + 1);
>
>         tmp = my_ether_aton(ether_str);
>         if (tmp == NULL)
> diff --git a/lib/librte_cmdline/cmdline_parse_ipaddr.c b/lib/librte_cmdline/cmdline_parse_ipaddr.c
> index ae6ea1007..d34436abc 100644
> --- a/lib/librte_cmdline/cmdline_parse_ipaddr.c
> +++ b/lib/librte_cmdline/cmdline_parse_ipaddr.c
> @@ -277,7 +277,7 @@ cmdline_parse_ipaddr(cmdline_parse_token_hdr_t *tk, const char *buf, void *res,
>         if (token_len >= INET6_ADDRSTRLEN+4)
>                 return -1;
>
> -       snprintf(ip_str, token_len+1, "%s", buf);
> +       strlcpy(ip_str, buf, token_len + 1);
>
>         /* convert the network prefix */
>         if (tk2->ipaddr_data.flags & CMDLINE_IPADDR_NETWORK) {
> diff --git a/lib/librte_cmdline/cmdline_parse_portlist.c b/lib/librte_cmdline/cmdline_parse_portlist.c
> index 5952f3438..ad43b522e 100644
> --- a/lib/librte_cmdline/cmdline_parse_portlist.c
> +++ b/lib/librte_cmdline/cmdline_parse_portlist.c
> @@ -94,7 +94,7 @@ cmdline_parse_portlist(__attribute__((unused)) cmdline_parse_token_hdr_t *tk,
>         if (token_len >= PORTLIST_TOKEN_SIZE)
>                 return -1;
>
> -       snprintf(portlist_str, token_len+1, "%s", buf);
> +       strlcpy(portlist_str, buf, token_len + 1);
>
>         if (pl) {
>                 pl->map = 0;
> diff --git a/lib/librte_cmdline/cmdline_parse_string.c b/lib/librte_cmdline/cmdline_parse_string.c
> index abde0412a..9cf41d0f7 100644
> --- a/lib/librte_cmdline/cmdline_parse_string.c
> +++ b/lib/librte_cmdline/cmdline_parse_string.c
> @@ -125,10 +125,10 @@ cmdline_parse_string(cmdline_parse_token_hdr_t *tk, const char *buf, void *res,
>         if (res) {
>                 if ((sd->str != NULL) && (strcmp(sd->str, TOKEN_STRING_MULTI) == 0))
>                         /* we are sure that token_len is < STR_MULTI_TOKEN_SIZE-1 */
> -                       snprintf(res, STR_MULTI_TOKEN_SIZE, "%s", buf);
> +                       strlcpy(res, buf, STR_MULTI_TOKEN_SIZE);
>                 else
>                         /* we are sure that token_len is < STR_TOKEN_SIZE-1 */
> -                       snprintf(res, STR_TOKEN_SIZE, "%s", buf);
> +                       strlcpy(res, buf, STR_TOKEN_SIZE);
>
>                 *((char *)res + token_len) = 0;
>         }
> diff --git a/lib/librte_eal/common/eal_common_bus.c b/lib/librte_eal/common/eal_common_bus.c
> index 3e022d510..0943851cc 100644
> --- a/lib/librte_eal/common/eal_common_bus.c
> +++ b/lib/librte_eal/common/eal_common_bus.c
> @@ -36,6 +36,7 @@
>
>  #include <rte_bus.h>
>  #include <rte_debug.h>
> +#include <rte_string_fns.h>
>
>  #include "eal_private.h"
>
> @@ -212,7 +213,7 @@ rte_bus_find_by_device_name(const char *str)
>         char name[RTE_DEV_NAME_MAX_LEN];
>         char *c;
>
> -       snprintf(name, sizeof(name), "%s", str);
> +       strlcpy(name, str, sizeof(name));
>         c = strchr(name, ',');
>         if (c != NULL)
>                 c[0] = '\0';
> diff --git a/lib/librte_eal/common/include/rte_string_fns.h b/lib/librte_eal/common/include/rte_string_fns.h
> index e97047a47..ff4c98b2a 100644
> --- a/lib/librte_eal/common/include/rte_string_fns.h
> +++ b/lib/librte_eal/common/include/rte_string_fns.h
> @@ -45,6 +45,20 @@ int
>  rte_strsplit(char *string, int stringlen,
>               char **tokens, int maxtokens, char delim);
>
> +/* pull in a strlcpy function */
> +#ifdef RTE_EXEC_ENV_BSDAPP
> +#include <string.h>
> +
> +#else /* non-BSD platforms */
> +#ifdef RTE_USE_LIBBSD
> +#include <bsd/string.h>
> +
> +#else /* no BSD header files, create own */
> +#define strlcpy(dst, src, size) snprintf(dst, size, "%s", src)
> +
> +#endif /* RTE_USE_LIBBSD */
> +#endif /* BSDAPP */
> +
>  #ifdef __cplusplus
>  }
>  #endif
> diff --git a/lib/librte_pdump/rte_pdump.c b/lib/librte_pdump/rte_pdump.c
> index ec8a5d84c..41a9deeba 100644
> --- a/lib/librte_pdump/rte_pdump.c
> +++ b/lib/librte_pdump/rte_pdump.c
> @@ -17,6 +17,7 @@
>  #include <rte_lcore.h>
>  #include <rte_log.h>
>  #include <rte_errno.h>
> +#include <rte_string_fns.h>
>
>  #include "rte_pdump.h"
>
> @@ -401,9 +402,9 @@ pdump_get_socket_path(char *buffer, int bufsz, enum rte_pdump_socktype type)
>         int ret = 0;
>
>         if (type == RTE_PDUMP_SOCKET_SERVER && server_socket_dir[0] != 0)
> -               snprintf(dir, sizeof(dir), "%s", server_socket_dir);
> +               strlcpy(dir, server_socket_dir, sizeof(dir));
>         else if (type == RTE_PDUMP_SOCKET_CLIENT && client_socket_dir[0] != 0)
> -               snprintf(dir, sizeof(dir), "%s", client_socket_dir);
> +               strlcpy(dir, client_socket_dir, sizeof(dir));
>         else {
>                 if (getuid() != 0) {
>                         dir_home = getenv(SOCKET_PATH_HOME);
> @@ -891,10 +892,10 @@ rte_pdump_set_socket_dir(const char *path, enum rte_pdump_socktype type)
>         if (path != NULL) {
>                 if (type == RTE_PDUMP_SOCKET_SERVER) {
>                         count = sizeof(server_socket_dir);
> -                       ret = snprintf(server_socket_dir, count, "%s", path);
> +                       ret = strlcpy(server_socket_dir, path, count);
>                 } else {
>                         count = sizeof(client_socket_dir);
> -                       ret = snprintf(client_socket_dir, count, "%s", path);
> +                       ret = strlcpy(client_socket_dir, path, count);
>                 }
>
>                 if (ret < 0  || ret >= count) {
> diff --git a/test/test/test_cmdline_cirbuf.c b/test/test/test_cmdline_cirbuf.c
> index e9193f66c..8ac326cb0 100644
> --- a/test/test/test_cmdline_cirbuf.c
> +++ b/test/test/test_cmdline_cirbuf.c
> @@ -483,7 +483,7 @@ test_cirbuf_string_get_del_partial(void)
>         memset(tmp, 0, sizeof(tmp));
>         memset(tmp2, 0, sizeof(tmp));
>
> -       snprintf(tmp2, sizeof(tmp2), "%s", CIRBUF_STR_HEAD);
> +       strlcpy(tmp2, CIRBUF_STR_HEAD, sizeof(tmp2));
>
>         /*
>          * initialize circular buffer
> diff --git a/test/test/test_eal_flags.c b/test/test/test_eal_flags.c
> index 37c42efe8..93eb7a481 100644
> --- a/test/test/test_eal_flags.c
> +++ b/test/test/test_eal_flags.c
> @@ -1151,11 +1151,12 @@ test_memory_flags(void)
>         /* add one extra socket */
>         for (i = 0; i < num_sockets + 1; i++) {
>                 snprintf(buf, sizeof(buf), "%s%s", invalid_socket_mem, DEFAULT_MEM_SIZE);
> -               snprintf(invalid_socket_mem, sizeof(invalid_socket_mem), "%s", buf);
> +               strlcpy(invalid_socket_mem, buf, sizeof(invalid_socket_mem));
>
>                 if (num_sockets + 1 - i > 1) {
>                         snprintf(buf, sizeof(buf), "%s,", invalid_socket_mem);
> -                       snprintf(invalid_socket_mem, sizeof(invalid_socket_mem), "%s", buf);
> +                       strlcpy(invalid_socket_mem, buf,
> +                               sizeof(invalid_socket_mem));
>                 }
>         }
>
> @@ -1167,11 +1168,12 @@ test_memory_flags(void)
>         /* add one extra socket */
>         for (i = 0; i < num_sockets; i++) {
>                 snprintf(buf, sizeof(buf), "%s%s", valid_socket_mem, DEFAULT_MEM_SIZE);
> -               snprintf(valid_socket_mem, sizeof(valid_socket_mem), "%s", buf);
> +               strlcpy(valid_socket_mem, buf, sizeof(valid_socket_mem));
>
>                 if (num_sockets - i > 1) {
>                         snprintf(buf, sizeof(buf), "%s,", valid_socket_mem);
> -                       snprintf(valid_socket_mem, sizeof(valid_socket_mem), "%s", buf);
> +                       strlcpy(valid_socket_mem, buf,
> +                               sizeof(valid_socket_mem));
>                 }
>         }
>
> diff --git a/test/test/test_malloc.c b/test/test/test_malloc.c
> index d23192cf1..ccc5feaec 100644
> --- a/test/test/test_malloc.c
> +++ b/test/test/test_malloc.c
> @@ -378,7 +378,7 @@ test_realloc(void)
>                 printf("NULL pointer returned from rte_zmalloc\n");
>                 return -1;
>         }
> -       snprintf(ptr1, size1, "%s" ,hello_str);
> +       strlcpy(ptr1, hello_str, size1);
>         char *ptr2 = rte_realloc(ptr1, size2, RTE_CACHE_LINE_SIZE);
>         if (!ptr2){
>                 rte_free(ptr1);
> --
> 2.14.3
>

Safety first, looks good to me.

-- 
Matteo Croce
per aspera ad upstream


More information about the dev mailing list