summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Hopps <chopps@labn.net>2024-01-07 09:41:32 +0000
committerChristian Hopps <chopps@labn.net>2024-01-07 15:04:18 +0000
commit00138ffb47acc58a49e93a9b291a4b9e0c92096e (patch)
tree82ba0e95b6a7701dbee1fea578e32050ca7e6e0b
parentfa621322788001bda7c8bdf5eae1a269f8649582 (diff)
lib: fix clang SA warnings
Signed-off-by: Christian Hopps <chopps@labn.net>
-rw-r--r--lib/darr.h23
-rw-r--r--lib/northbound_oper.c13
-rw-r--r--mgmtd/mgmt_fe_adapter.c2
3 files changed, 29 insertions, 9 deletions
diff --git a/lib/darr.h b/lib/darr.h
index 2b6f0db0b9..df8ace62dd 100644
--- a/lib/darr.h
+++ b/lib/darr.h
@@ -77,6 +77,7 @@
*/
#include <zebra.h>
+#include <limits.h>
#include "memory.h"
DECLARE_MTYPE(DARR);
@@ -249,6 +250,10 @@ void *__darr_resize(void *a, uint count, size_t esize, struct memtype *mt);
* pointers into the previous memory block are no longer valid. The `A` value
* is guaranteed not to change if there is sufficient capacity in the array.
*
+ * The exception to the no-change rule is if @C is passed as 0, it will be
+ * considered 1 so that an array is always allocated if currently NULL,
+ * i.e., @A will never be NULL after a call to darr_ensure_cap_mt()
+ *
* Args:
* A: (IN/OUT) the dynamic array, can be NULL.
* C: Total capacity to guarantee.
@@ -259,8 +264,9 @@ void *__darr_resize(void *a, uint count, size_t esize, struct memtype *mt);
#define darr_ensure_cap_mt(A, C, MT) \
({ \
/* Cast to avoid warning when C == 0 */ \
- if ((ssize_t)darr_cap(A) < (ssize_t)(C)) \
- _darr_resize_mt((A), (C), MT); \
+ uint _c = (C) > 0 ? (C) : 1; \
+ if ((size_t)darr_cap(A) < _c) \
+ _darr_resize_mt((A), _c, MT); \
(A); \
})
#define darr_ensure_cap(A, C) darr_ensure_cap_mt(A, C, MTYPE_DARR)
@@ -285,11 +291,14 @@ void *__darr_resize(void *a, uint count, size_t esize, struct memtype *mt);
*/
#define darr_ensure_i_mt(A, I, MT) \
({ \
- if ((int)(I) > darr_maxi(A)) \
- _darr_resize_mt((A), (I) + 1, MT); \
- if ((I) + 1 > _darr_len(A)) \
- _darr_len(A) = (I) + 1; \
- &(A)[I]; \
+ assert((int)(I) >= 0 && (int)(I) <= INT_MAX); \
+ int _i = (int)(I); \
+ if (_i > darr_maxi(A)) \
+ _darr_resize_mt((A), _i + 1, MT); \
+ assert((A) != NULL); \
+ if ((uint)_i + 1 > _darr_len(A)) \
+ _darr_len(A) = _i + 1; \
+ &(A)[_i]; \
})
#define darr_ensure_i(A, I) darr_ensure_i_mt(A, I, MTYPE_DARR)
diff --git a/lib/northbound_oper.c b/lib/northbound_oper.c
index 334370d0ab..bd6d870ebc 100644
--- a/lib/northbound_oper.c
+++ b/lib/northbound_oper.c
@@ -807,6 +807,13 @@ static const struct lysc_node *nb_op_sib_first(struct nb_op_yield_state *ys,
const struct lysc_node *first_sib;
/*
+ * NOTE: when we want to handle root level walks we will need to use
+ * lys_getnext() to walk root level of each module and
+ * ly_ctx_get_module_iter() to walk the modules.
+ */
+ assert(darr_len(ys->node_infos) > 0);
+
+ /*
* The top of the node stack points at @parent.
*
* If the schema path (original query) is longer than our current node
@@ -814,7 +821,7 @@ static const struct lysc_node *nb_op_sib_first(struct nb_op_yield_state *ys,
* base of the user query, return the next schema node from the query
* string (schema_path).
*/
- assert(darr_last(ys->node_infos)->schema == parent);
+ assert(darr_last(ys->node_infos) != NULL && darr_last(ys->node_infos)->schema == parent);
if (darr_lasti(ys->node_infos) < ys->query_base_level)
return ys->schema_path[darr_lasti(ys->node_infos) + 1];
@@ -1010,10 +1017,14 @@ static enum nb_error __walk(struct nb_op_yield_state *ys, bool is_resume)
* should be kept.
*/
ret = nb_op_iter_leaf(ys, nn, xpath_child);
+ if (ret != NB_OK)
+ goto done;
sib = nb_op_sib_next(ys, sib);
continue;
case LYS_LEAFLIST:
ret = nb_op_iter_leaflist(ys, nn, xpath_child);
+ if (ret != NB_OK)
+ goto done;
sib = nb_op_sib_next(ys, sib);
continue;
case LYS_CONTAINER:
diff --git a/mgmtd/mgmt_fe_adapter.c b/mgmtd/mgmt_fe_adapter.c
index d98444703f..5f17b89c5c 100644
--- a/mgmtd/mgmt_fe_adapter.c
+++ b/mgmtd/mgmt_fe_adapter.c
@@ -1105,7 +1105,7 @@ static int fe_adapter_send_tree_data(struct mgmt_fe_session_ctx *session,
LYD_PRINT_WITHSIBLINGS));
/* buf may have been reallocated and moved */
msg = (typeof(msg))buf;
-
+ (void)msg; /* suppress clang-SA unused warning on safety code */
if (ret != LY_SUCCESS) {
MGMTD_FE_ADAPTER_ERR("Error building get-tree result for client %s session-id %" PRIu64