From 77bc35d29d6d0402d93e3f6bedec741c105a8d47 Mon Sep 17 00:00:00 2001 From: Samuel Gauthier Date: Thu, 1 Feb 2024 16:31:12 +0100 Subject: [PATCH] session: fix rpc_send_ly dnode free function When rpc_send_ly is called more that 255 times in the same session, it fails, because the context has been acquired too many times. The new_dnode function can not be used for rpc_send_ly because it does not free the output node, it only frees output.tree. Use a mechanism similar to get_data_ly, i.e free the output node returned by sr_rpc_send_tree, call sr_release_data on it as well, and release the context that was used by our new dnode. Signed-off-by: Samuel Gauthier --- sysrepo/session.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/sysrepo/session.py b/sysrepo/session.py index 2b43e42..79c3493 100644 --- a/sysrepo/session.py +++ b/sysrepo/session.py @@ -1472,7 +1472,17 @@ def rpc_send_ly( if not sr_data_p[0]: raise SysrepoInternalError("sr_rpc_send_tree returned NULL") - return self.new_dnode(sr_data_p[0].tree) + ctx = self.acquire_context() + dnode = libyang.DNode.new(ctx, sr_data_p[0].tree) + + # customize the free method to use the sysrepo free + def sysrepo_free(dnode_src): + lib.sr_release_data(sr_data_p[0]) + self.release_context() + + dnode.free_func = sysrepo_free + + return dnode def rpc_send( self,