Fixed memory leak in new candidate_validate function

Added error returns for clixon-lib process rpc empty returns
This commit is contained in:
Olof hagsand 2021-06-23 10:50:47 +02:00
parent cb469a2bc7
commit ba45d6d2a1
3 changed files with 57 additions and 45 deletions

View file

@ -612,20 +612,27 @@ candidate_validate(clicon_handle h,
* use clicon_err. */ * use clicon_err. */
if (xret && clicon_xml2cbuf(cbret, xret, 0, 0, -1) < 0) if (xret && clicon_xml2cbuf(cbret, xret, 0, 0, -1) < 0)
goto done; goto done;
plugin_transaction_abort_all(h, td);
if (!cbuf_len(cbret) && if (!cbuf_len(cbret) &&
netconf_operation_failed(cbret, "application", clicon_err_reason)< 0) netconf_operation_failed(cbret, "application", clicon_err_reason)< 0)
goto done; goto done;
goto fail; goto fail;
} }
if (xmldb_get0_clear(h, td->td_src) < 0 || if (xmldb_get0_clear(h, td->td_src) < 0 ||
xmldb_get0_clear(h, td->td_target) < 0){ xmldb_get0_clear(h, td->td_target) < 0)
plugin_transaction_abort_all(h, td);
goto done; goto done;
}
plugin_transaction_end_all(h, td); plugin_transaction_end_all(h, td);
retval = 1; retval = 1;
done: done:
if (xret)
xml_free(xret);
if (td){
if (retval < 1)
plugin_transaction_abort_all(h, td);
xmldb_get0_free(h, &td->td_target);
xmldb_get0_free(h, &td->td_src);
transaction_free(td);
}
return retval; return retval;
fail: fail:
retval = 0; retval = 0;

View file

@ -270,11 +270,11 @@ restconf_pseudo_process_control(clicon_handle h)
* see restconf_pseudo_set_log which sets flag when process starts * see restconf_pseudo_set_log which sets flag when process starts
*/ */
argv[i++] = "-D"; argv[i++] = "-D";
argv[i++] = strdup("0"); argv[i++] = "0";
argv[i++] = "-l"; argv[i++] = "-l";
argv[i++] = strdup("s"); /* There is also log-destination in clixon-restconf.yang */ argv[i++] = "s"; /* There is also log-destination in clixon-restconf.yang */
argv[i++] = "-R"; argv[i++] = "-R";
argv[i++] = strdup(""); argv[i++] = "";
argv[i++] = NULL; argv[i++] = NULL;
assert(i==nr); assert(i==nr);
if (clixon_process_register(h, RESTCONF_PROCESS, if (clixon_process_register(h, RESTCONF_PROCESS,

View file

@ -682,48 +682,53 @@ clixon_process_status(clicon_handle h,
int run; int run;
int i; int i;
char timestr[28]; char timestr[28];
int match = 0;
if (_proc_entry_list == NULL) if (_proc_entry_list != NULL){
goto ok; pe = _proc_entry_list;
pe = _proc_entry_list; do {
do { if (strcmp(pe->pe_name, name) == 0){
if (strcmp(pe->pe_name, name) == 0){ /* Check if running */
/* Check if running */ run = 0;
run = 0; if (pe->pe_pid && proc_op_run(pe->pe_pid, &run) < 0)
if (pe->pe_pid && proc_op_run(pe->pe_pid, &run) < 0)
goto done;
cprintf(cbret, "<rpc-reply xmlns=\"%s\"><active xmlns=\"%s\">%s</active>",
NETCONF_BASE_NAMESPACE, CLIXON_LIB_NS, run?"true":"false");
if (pe->pe_description)
cprintf(cbret, "<description xmlns=\"%s\">%s</description>", CLIXON_LIB_NS, pe->pe_description);
cprintf(cbret, "<command xmlns=\"%s\">", CLIXON_LIB_NS);
/* the command may include any data, including XML (such as restconf -R command) and
therefore needs CDATA encoding */
cprintf(cbret, "<![CDATA[");
for (i=0; i<pe->pe_argc-1; i++){
if (i)
cprintf(cbret, " ");
cprintf(cbret, "%s", pe->pe_argv[i]);
}
cprintf(cbret, "]]>");
cprintf(cbret, "</command>");
cprintf(cbret, "<status xmlns=\"%s\">%s</status>", CLIXON_LIB_NS,
clicon_int2str(proc_state_map, pe->pe_state));
if (timerisset(&pe->pe_starttime)){
if (time2str(pe->pe_starttime, timestr, sizeof(timestr)) < 0){
clicon_err(OE_UNIX, errno, "time2str");
goto done; goto done;
cprintf(cbret, "<rpc-reply xmlns=\"%s\"><active xmlns=\"%s\">%s</active>",
NETCONF_BASE_NAMESPACE, CLIXON_LIB_NS, run?"true":"false");
if (pe->pe_description)
cprintf(cbret, "<description xmlns=\"%s\">%s</description>", CLIXON_LIB_NS, pe->pe_description);
cprintf(cbret, "<command xmlns=\"%s\">", CLIXON_LIB_NS);
/* the command may include any data, including XML (such as restconf -R command) and
therefore needs CDATA encoding */
cprintf(cbret, "<![CDATA[");
for (i=0; i<pe->pe_argc-1; i++){
if (i)
cprintf(cbret, " ");
cprintf(cbret, "%s", pe->pe_argv[i]);
} }
cprintf(cbret, "<starttime xmlns=\"%s\">%s</starttime>", CLIXON_LIB_NS, timestr); cprintf(cbret, "]]>");
cprintf(cbret, "</command>");
cprintf(cbret, "<status xmlns=\"%s\">%s</status>", CLIXON_LIB_NS,
clicon_int2str(proc_state_map, pe->pe_state));
if (timerisset(&pe->pe_starttime)){
if (time2str(pe->pe_starttime, timestr, sizeof(timestr)) < 0){
clicon_err(OE_UNIX, errno, "time2str");
goto done;
}
cprintf(cbret, "<starttime xmlns=\"%s\">%s</starttime>", CLIXON_LIB_NS, timestr);
}
if (pe->pe_pid)
cprintf(cbret, "<pid xmlns=\"%s\">%u</pid>", CLIXON_LIB_NS, pe->pe_pid);
cprintf(cbret, "</rpc-reply>");
match++;
break; /* hit break here */
} }
if (pe->pe_pid) pe = NEXTQ(process_entry_t *, pe);
cprintf(cbret, "<pid xmlns=\"%s\">%u</pid>", CLIXON_LIB_NS, pe->pe_pid); } while (pe != _proc_entry_list);
cprintf(cbret, "</rpc-reply>"); }
break; /* hit break here */ if (!match){ /* No match, return error */
} if (netconf_unknown_element(cbret, "application", (char*)name, "Process service is not known") < 0)
pe = NEXTQ(process_entry_t *, pe); goto done;
} while (pe != _proc_entry_list); }
ok:
retval = 0; retval = 0;
done: done:
clicon_debug(1, "%s retval:%d", __FUNCTION__, retval); clicon_debug(1, "%s retval:%d", __FUNCTION__, retval);