Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:Ledest:erlang:23
erlang
2322-erl_call-Fix-codechecker-warning-for-flags...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 2322-erl_call-Fix-codechecker-warning-for-flags-leaks.patch of Package erlang
From e0624a8b49b67bc1c0a39990a5325c740ddf4add Mon Sep 17 00:00:00 2001 From: Kjell Winblad <kjellwinblad@gmail.com> Date: Tue, 16 Mar 2021 14:41:08 +0100 Subject: [PATCH 2/6] erl_call: Fix codechecker warning for flags leaks --- lib/erl_interface/src/prog/erl_call.c | 67 ++++++++++++++++++--------- 1 file changed, 44 insertions(+), 23 deletions(-) diff --git a/lib/erl_interface/src/prog/erl_call.c b/lib/erl_interface/src/prog/erl_call.c index d4b77bd770..68392594f3 100644 --- a/lib/erl_interface/src/prog/erl_call.c +++ b/lib/erl_interface/src/prog/erl_call.c @@ -115,6 +115,7 @@ static char* ei_chk_strdup(char *s); static int rpc_print_node_stdout(ei_cnode* ec, int fd, char *mod, char *fun, const char* inbuf, int inbuflen, ei_x_buff* x); +static void exit_free_flags_fields(int exit_status, struct call_flags* flags); /* Converts the given hostname to a shortname, if required. */ static void format_node_hostname(const struct call_flags *flags, @@ -158,7 +159,10 @@ int main(int argc, char *argv[]) flags.hostname = NULL; flags.fetch_stdout = 0; flags.print_result_term = 1; - + flags.script = NULL; + flags.hidden = NULL; + flags.apply = NULL; + flags.cookie = NULL; ei_init(); /* Get the command line options */ @@ -367,7 +371,7 @@ int main(int argc, char *argv[]) /* gethostname requires len to be max(hostname) + 1 */ if (gethostname(h_hostname, EI_MAXHOSTNAMELEN+1) < 0) { fprintf(stderr,"erl_call: failed to get host name: %d\n", errno); - exit(1); + exit_free_flags_fields(1, &flags); } if (flags.use_localhost_fallback || (hp = ei_gethostbyname(h_hostname)) == 0) { @@ -385,7 +389,7 @@ int main(int argc, char *argv[]) if (snprintf(h_nodename_buf, sizeof(h_nodename_buf), "%s@%s", h_alivename, h_hostname) > sizeof(h_nodename_buf)) {; fprintf(stderr,"erl_call: hostname too long: %s\n", h_hostname); - exit(1); + exit_free_flags_fields(1, &flags); } } else { @@ -399,7 +403,7 @@ int main(int argc, char *argv[]) (short) creation) < 0) { fprintf(stderr,"erl_call: can't create C node %s; %d\n", h_nodename, erl_errno); - exit(1); + exit_free_flags_fields(1, &flags); } } @@ -425,7 +429,7 @@ int main(int argc, char *argv[]) } else { if ((hp = ei_gethostbyname(host)) == 0) { fprintf(stderr,"erl_call: can't ei_gethostbyname(%s)\n", host); - exit(1); + exit_free_flags_fields(1, &flags); } format_node_hostname(&flags, hp->h_name, host_name); @@ -434,7 +438,7 @@ int main(int argc, char *argv[]) if (snprintf(nodename, sizeof(nodename), "%s@%s", flags.node, host_name) > sizeof(nodename)) { fprintf(stderr,"erl_call: nodename too long: %s\n", flags.node); - exit(1); + exit_free_flags_fields(1, &flags); } } /* @@ -449,11 +453,11 @@ int main(int argc, char *argv[]) /* We failed to connect ourself */ /* FIXME do we really know we failed because of node not up? */ if (flags.haltp) { - exit(0); + exit_free_flags_fields(0, &flags); } else { fprintf(stderr,"erl_call: failed to connect to node %s\n", nodename); - exit(1); + exit_free_flags_fields(1, &flags); } } } else { @@ -462,12 +466,12 @@ int main(int argc, char *argv[]) /* We failed to connect ourself */ /* FIXME do we really know we failed because of node not up? */ if (flags.haltp) { - exit(0); + exit_free_flags_fields(0, &flags); } else { fprintf(stderr,"erl_call: failed to connect to node with address \"%s:%ld\"\n", flags.hostname == NULL ? "" : flags.hostname, flags.port); - exit(1); + exit_free_flags_fields(1, &flags); } } } @@ -491,7 +495,7 @@ int main(int argc, char *argv[]) ei_rpc(&ec, fd, "erlang", "halt", p, i, &reply); free(p); ei_x_free(&reply); - exit(0); + exit_free_flags_fields(0, &flags); } if (flags.verbosep) { @@ -513,7 +517,7 @@ int main(int argc, char *argv[]) if (strlen(modname) + 4 + 1 > sizeof(fname)) { fprintf(stderr,"erl_call: module name too long: %s\n", modname); - exit(1); + exit_free_flags_fields(1, &flags); } strcpy(fname, modname); strcat(fname, ".erl"); @@ -547,7 +551,7 @@ int main(int argc, char *argv[]) ei_x_free(&reply); fprintf(stderr,"erl_call: can't write to source file %s\n", fname); - exit(1); + exit_free_flags_fields(1, &flags); } free(p); ei_x_free(&reply); @@ -642,7 +646,7 @@ int main(int argc, char *argv[]) free(p); free(evalbuf); /* Allocated in read_stdin() */ ei_x_free(&reply); - exit(1); + exit_free_flags_fields(1, &flags); } if (flags.print_result_term) { i = 0; @@ -670,7 +674,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "erl_call: Failed to parse arguments,\n" "see the documentation for allowed term types.\n" "Arguments: %s\n", args); - exit(-1); + exit_free_flags_fields(-1, &flags); } ei_x_new_with_version(&reply); @@ -684,7 +688,7 @@ int main(int argc, char *argv[]) /* FIXME no error message and why -1 ? */ ei_x_free(&e); ei_x_free(&reply); - exit(-1); + exit_free_flags_fields(-1, &flags); } else { if (flags.print_result_term) { int i = 0; @@ -694,7 +698,7 @@ int main(int argc, char *argv[]) ei_x_free(&reply); } } - + exit_free_flags_fields(0, &flags); return(0); } @@ -751,7 +755,7 @@ static int do_connect(ei_cnode *ec, char *nodename, struct call_flags *flags) if ((r=erl_start_sys(ec,alive,(Erl_IpAddr)(h->h_addr_list[0]), start_flags,flags->script,args)) < 0) { fprintf(stderr,"erl_call: unable to start node, error = %d\n", r); - exit(1); + exit_free_flags_fields(1, flags); } if ((fd=ei_connect(ec, nodename)) >= 0) { @@ -765,19 +769,19 @@ static int do_connect(ei_cnode *ec, char *nodename, struct call_flags *flags) switch (fd) { case ERL_NO_DAEMON: fprintf(stderr,"erl_call: no epmd running\n"); - exit(1); + exit_free_flags_fields(1, flags); case ERL_CONNECT_FAIL: fprintf(stderr,"erl_call: connect failed\n"); - exit(1); + exit_free_flags_fields(1, flags); case ERL_NO_PORT: fprintf(stderr,"erl_call: node is not running\n"); - exit(1); + exit_free_flags_fields(1, flags); case ERL_TIMEOUT: fprintf(stderr,"erl_call: connect timed out\n"); - exit(1); + exit_free_flags_fields(1, flags); default: fprintf(stderr,"erl_call: error during connect\n"); - exit(1); + exit_free_flags_fields(1, flags); } } } @@ -1112,3 +1116,20 @@ ebadmsg: return ERL_ERROR; } + + +void exit_free_flags_fields(int exit_status, struct call_flags* flags) { + if (flags->script != NULL) { + free(flags->script); + } + if (flags->hidden != NULL) { + free(flags->hidden); + } + if (flags->cookie != NULL) { + free(flags->cookie); + } + if (flags->apply != NULL) { + free(flags->apply); + } + exit(exit_status); +} -- 2.26.2
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor