From: Thomas Monjalon Date: Sun, 13 Jun 2021 08:24:21 +0000 (+0800) Subject: eal: save error in string copy X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=dbba7c9efbb9ed5cfc88c192213f54b1f9942c00;p=dpdk.git eal: save error in string copy The string copy api rte_strscpy() did not set rte_errno during failures, instead it just returned negative error number. Set rte_errrno if the destination buffer is too small. Signed-off-by: Thomas Monjalon Signed-off-by: Xueming Li Reviewed-by: David Marchand --- diff --git a/doc/guides/rel_notes/release_21_08.rst b/doc/guides/rel_notes/release_21_08.rst index a6ecfdf3ce..da38465ecb 100644 --- a/doc/guides/rel_notes/release_21_08.rst +++ b/doc/guides/rel_notes/release_21_08.rst @@ -84,6 +84,9 @@ API Changes Also, make sure to start the actual text at the margin. ======================================================= +* eal: ``rte_strscpy`` sets ``rte_errno`` to ``E2BIG`` in case of string + truncation. + ABI Changes ----------- diff --git a/lib/eal/common/eal_common_string_fns.c b/lib/eal/common/eal_common_string_fns.c index 60c5dd66f9..ddd1891656 100644 --- a/lib/eal/common/eal_common_string_fns.c +++ b/lib/eal/common/eal_common_string_fns.c @@ -8,6 +8,7 @@ #include #include +#include /* split string into tokens */ int @@ -62,5 +63,6 @@ rte_strscpy(char *dst, const char *src, size_t dsize) /* Not enough room in dst, set NUL and return error. */ if (res != 0) dst[res - 1] = '\0'; - return -E2BIG; + rte_errno = E2BIG; + return -rte_errno; } diff --git a/lib/eal/common/eal_common_trace.c b/lib/eal/common/eal_common_trace.c index 24e27387b1..7bff1cd2ce 100644 --- a/lib/eal/common/eal_common_trace.c +++ b/lib/eal/common/eal_common_trace.c @@ -500,7 +500,6 @@ __rte_trace_point_register(rte_trace_point_t *handle, const char *name, /* Initialize the trace point */ if (rte_strscpy(tp->name, name, TRACE_POINT_NAME_SIZE) < 0) { trace_err("name is too long"); - rte_errno = E2BIG; goto free; } diff --git a/lib/eal/include/rte_string_fns.h b/lib/eal/include/rte_string_fns.h index 8bac8243c9..bb43b2cba3 100644 --- a/lib/eal/include/rte_string_fns.h +++ b/lib/eal/include/rte_string_fns.h @@ -97,8 +97,6 @@ rte_strlcat(char *dst, const char *src, size_t size) * Copy string src to buffer dst of size dsize. * At most dsize-1 chars will be copied. * Always NUL-terminates, unless (dsize == 0). - * Returns number of bytes copied (terminating NUL-byte excluded) on success ; - * negative errno on error. * * @param dst * The destination string. @@ -110,8 +108,9 @@ rte_strlcat(char *dst, const char *src, size_t size) * Length in bytes of the destination buffer. * * @return - * The number of bytes copied on success + * The number of bytes copied (terminating NUL-byte excluded) on success. * -E2BIG if the destination buffer is too small. + * rte_errno is set. */ ssize_t rte_strscpy(char *dst, const char *src, size_t dsize); diff --git a/lib/graph/node.c b/lib/graph/node.c index 873c9ab16d..86ec4316f9 100644 --- a/lib/graph/node.c +++ b/lib/graph/node.c @@ -86,10 +86,8 @@ __rte_node_register(const struct rte_node_register *reg) } /* Initialize the node */ - if (rte_strscpy(node->name, reg->name, RTE_NODE_NAMESIZE) < 0) { - rte_errno = E2BIG; + if (rte_strscpy(node->name, reg->name, RTE_NODE_NAMESIZE) < 0) goto free; - } node->flags = reg->flags; node->process = reg->process; node->init = reg->init; @@ -98,10 +96,8 @@ __rte_node_register(const struct rte_node_register *reg) node->parent_id = reg->parent_id; for (i = 0; i < reg->nb_edges; i++) { if (rte_strscpy(node->next_nodes[i], reg->next_nodes[i], - RTE_NODE_NAMESIZE) < 0) { - rte_errno = E2BIG; + RTE_NODE_NAMESIZE) < 0) goto free; - } } node->id = node_id++; @@ -278,10 +274,8 @@ edge_update(struct node *node, struct node *prev, rte_edge_t from, /* Update the new nodes name */ for (i = from; i < max_edges; i++, count++) { if (rte_strscpy(node->next_nodes[i], next_nodes[count], - RTE_NODE_NAMESIZE) < 0) { - rte_errno = E2BIG; + RTE_NODE_NAMESIZE) < 0) goto restore; - } } restore: /* Update the linked list to point new node address in prev node */