Memory leak/err in notification when closing down

test: restconf notification chunked framing update
This commit is contained in:
Olof hagsand 2022-04-17 13:21:05 +02:00
parent feec3a21d9
commit 600f0616f6
3 changed files with 12 additions and 7 deletions

View file

@ -444,7 +444,7 @@ netconf_notification_cb(int s,
struct clicon_msg *reply = NULL; struct clicon_msg *reply = NULL;
int eof; int eof;
int retval = -1; int retval = -1;
cbuf *cb; cbuf *cb = NULL;
cxobj *xn = NULL; /* event xml */ cxobj *xn = NULL; /* event xml */
cxobj *xt = NULL; /* top xml */ cxobj *xt = NULL; /* top xml */
clicon_handle h = (clicon_handle)arg; clicon_handle h = (clicon_handle)arg;
@ -485,17 +485,22 @@ netconf_notification_cb(int s,
goto done; goto done;
/* Send it to listening client on stdout */ /* Send it to listening client on stdout */
if (netconf_output_encap(clicon_option_int(h, "netconf-framing"), cb) < 0){ if (netconf_output_encap(clicon_option_int(h, "netconf-framing"), cb) < 0){
cbuf_free(cb);
goto done; goto done;
} }
if (netconf_output(1, cb, "notification") < 0) if (netconf_output(1, cb, "notification") < 0){
clicon_err(OE_PROTO, ESHUTDOWN, "Socket unexpected close");
close(s);
errno = ESHUTDOWN;
clixon_event_unreg_fd(s, netconf_notification_cb);
goto done; goto done;
}
fflush(stdout); fflush(stdout);
cbuf_free(cb);
ok: ok:
retval = 0; retval = 0;
done: done:
clicon_debug(1, "%s %d", __FUNCTION__, retval); clicon_debug(1, "%s %d", __FUNCTION__, retval);
if (cb)
cbuf_free(cb);
if (nsc) if (nsc)
xml_nsctx_free(nsc); xml_nsctx_free(nsc);
if (xt != NULL) if (xt != NULL)

View file

@ -2003,7 +2003,7 @@ netconf_output(int s,
} }
if (write(s, buf, len) < 0){ if (write(s, buf, len) < 0){
if (errno == EPIPE) if (errno == EPIPE)
; clicon_debug(1, "%s write err SIGPIPE", __FUNCTION__);
else else
clicon_log(LOG_ERR, "%s: write: %s", __FUNCTION__, strerror(errno)); clicon_log(LOG_ERR, "%s: write: %s", __FUNCTION__, strerror(errno));
goto done; goto done;

View file

@ -55,7 +55,7 @@ cat <<EOF > $cfg
<CLICON_SOCK>/usr/local/var/$APPNAME/$APPNAME.sock</CLICON_SOCK> <CLICON_SOCK>/usr/local/var/$APPNAME/$APPNAME.sock</CLICON_SOCK>
<CLICON_BACKEND_DIR>/usr/local/lib/$APPNAME/backend</CLICON_BACKEND_DIR> <CLICON_BACKEND_DIR>/usr/local/lib/$APPNAME/backend</CLICON_BACKEND_DIR>
<CLICON_BACKEND_REGEXP>example_backend.so$</CLICON_BACKEND_REGEXP> <CLICON_BACKEND_REGEXP>example_backend.so$</CLICON_BACKEND_REGEXP>
<CLICON_BACKEND_PIDFILE>$dir/restconf.pidfile</CLICON_BACKEND_PIDFILE> <CLICON_BACKEND_PIDFILE>/usr/local/var/$APPNAME/$APPNAME.pidfile</CLICON_BACKEND_PIDFILE>
<CLICON_XMLDB_DIR>/usr/local/var/$APPNAME</CLICON_XMLDB_DIR> <CLICON_XMLDB_DIR>/usr/local/var/$APPNAME</CLICON_XMLDB_DIR>
<CLICON_CLISPEC_DIR>/usr/local/lib/$APPNAME/clispec</CLICON_CLISPEC_DIR> <CLICON_CLISPEC_DIR>/usr/local/lib/$APPNAME/clispec</CLICON_CLISPEC_DIR>
<CLICON_CLI_DIR>/usr/local/lib/$APPNAME/cli</CLICON_CLI_DIR> <CLICON_CLI_DIR>/usr/local/lib/$APPNAME/cli</CLICON_CLI_DIR>
@ -140,7 +140,7 @@ new "wait restconf"
wait_restconf wait_restconf
new "netconf event stream discovery RFC8040 Sec 6.2" new "netconf event stream discovery RFC8040 Sec 6.2"
expecteof "$clixon_netconf -D $DBG -qf $cfg" 0 "$DEFAULTHELLO<rpc $DEFAULTNS><get><filter type=\"xpath\" select=\"r:restconf-state/r:streams\" xmlns:r=\"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring\"/></get></rpc>]]>]]>" "<rpc-reply $DEFAULTNS><data><restconf-state xmlns=\"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring\"><streams><stream><name>EXAMPLE</name><description>Example event stream</description><replay-support>true</replay-support><access><encoding>xml</encoding><location>https://localhost/streams/EXAMPLE</location></access></stream></streams></restconf-state></data></rpc-reply>]]>]]>" expecteof_netconf "$clixon_netconf -D $DBG -qf $cfg" 0 "$DEFAULTHELLO" "<rpc $DEFAULTNS><get><filter type=\"xpath\" select=\"r:restconf-state/r:streams\" xmlns:r=\"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring\"/></get></rpc>" "" "<rpc-reply $DEFAULTNS><data><restconf-state xmlns=\"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring\"><streams><stream><name>EXAMPLE</name><description>Example event stream</description><replay-support>true</replay-support><access><encoding>xml</encoding><location>https://localhost/streams/EXAMPLE</location></access></stream></streams></restconf-state></data></rpc-reply>"
# #
# 1.2 Netconf stream subscription # 1.2 Netconf stream subscription