eal: save error in string copy
authorThomas Monjalon <thomas@monjalon.net>
Sun, 13 Jun 2021 08:24:21 +0000 (16:24 +0800)
committerDavid Marchand <david.marchand@redhat.com>
Mon, 5 Jul 2021 13:11:30 +0000 (15:11 +0200)
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 <thomas@monjalon.net>
Signed-off-by: Xueming Li <xuemingl@nvidia.com>
Reviewed-by: David Marchand <david.marchand@redhat.com>
doc/guides/rel_notes/release_21_08.rst
lib/eal/common/eal_common_string_fns.c
lib/eal/common/eal_common_trace.c
lib/eal/include/rte_string_fns.h
lib/graph/node.c

index a6ecfdf..da38465 100644 (file)
@@ -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
 -----------
index 60c5dd6..ddd1891 100644 (file)
@@ -8,6 +8,7 @@
 #include <errno.h>
 
 #include <rte_string_fns.h>
+#include <rte_errno.h>
 
 /* 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;
 }
index 24e2738..7bff1cd 100644 (file)
@@ -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;
        }
 
index 8bac824..bb43b2c 100644 (file)
@@ -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);
index 873c9ab..86ec431 100644 (file)
@@ -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 */