From 5fb894eefa6870f7f132b782b4fa5379b01c9f61 Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Wed, 29 Nov 2023 23:00:44 +0100 Subject: [PATCH] confd: Don't cache libyang module references As it turns out, references to module objects are not safe to keep across callbacks. In particular: loading a new model into sysrepo at runtime may cause it to move objects around in memory. Therefore, fetch a valid reference to "infix-system" on every callback instead. --- src/confd/src/infix-system-software.c | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/src/confd/src/infix-system-software.c b/src/confd/src/infix-system-software.c index 1fece7cb5..03c205dd5 100644 --- a/src/confd/src/infix-system-software.c +++ b/src/confd/src/infix-system-software.c @@ -9,8 +9,6 @@ #define SW_STATE_PATH_ "/ietf-system:system-state/infix-system:software" -static const struct lys_module *infix_system; - static RaucInstaller *infix_system_sw_new_rauc(void) { RaucInstaller *rauc; @@ -183,6 +181,8 @@ static int infix_system_sw_state(sr_session_ctx_t *session, uint32_t sub_id, struct lyd_node **parent, void *priv) { sr_error_t srerr = SR_ERR_INTERNAL; + const struct lys_module *ixsys; + const struct ly_ctx *ly; RaucInstaller *rauc; struct lyd_node *sw; @@ -192,7 +192,15 @@ static int infix_system_sw_state(sr_session_ctx_t *session, uint32_t sub_id, if (!rauc) return SR_ERR_INTERNAL; - if (lyd_new_inner(*parent, infix_system, "software", 0, &sw)) + ly = sr_acquire_context(sr_session_get_connection(session)); + ixsys = ly_ctx_get_module_implemented(ly, "infix-system"); + sr_release_context(sr_session_get_connection(session)); + if (!ixsys) { + ERROR("infix-system module not found"); + goto out; + } + + if (lyd_new_inner(*parent, ixsys, "software", 0, &sw)) goto out; srerr = infix_system_sw_state_fill(sw, rauc); @@ -233,18 +241,8 @@ static int infix_system_sw_install(sr_session_ctx_t *session, uint32_t sub_id, int infix_system_sw_init(struct confd *confd) { - const struct ly_ctx *ly; int rc = 0; - ly = sr_acquire_context(sr_session_get_connection(confd->session)); - infix_system = ly_ctx_get_module_implemented(ly, "infix-system"); - sr_release_context(sr_session_get_connection(confd->session)); - if (!infix_system) { - ERROR("infix-system module not found"); - rc = -ENOENT; - goto fail; - } - REGISTER_OPER(confd->session, "ietf-system", SW_STATE_PATH_, infix_system_sw_state, NULL, 0, &confd->sub);