Fixed memory leak in new candidate_validate function
Added error returns for clixon-lib process rpc empty returns
This commit is contained in:
parent
cb469a2bc7
commit
ba45d6d2a1
3 changed files with 57 additions and 45 deletions
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue