summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJiří Klimeš <jklimes@redhat.com>2013-10-01 18:45:26 +0200
committerJiří Klimeš <jklimes@redhat.com>2013-10-02 11:48:07 +0200
commit9e9afdb25beedc7b456d919c672c54a055f8b931 (patch)
tree7599a93da653e039f79092a49e0d2ef3e4c6085d
parentd3aae79e5c7ec24553b3d10bc640f418aceb65ef (diff)
downloadNetworkManager-9e9afdb25beedc7b456d919c672c54a055f8b931.tar.gz
cli: fix memory leaks on questionnaires
-rw-r--r--cli/src/connections.c221
1 files changed, 158 insertions, 63 deletions
diff --git a/cli/src/connections.c b/cli/src/connections.c
index 7910112b36..a24926ed1c 100644
--- a/cli/src/connections.c
+++ b/cli/src/connections.c
@@ -2332,37 +2332,46 @@ do_questionnaire_ethernet (gboolean ethernet, char **mtu, char **mac, char **clo
/* Ask for optional arguments */
printf (_("There are 3 optional arguments for '%s' connection type.\n"), type);;
answer = nmc_get_user_input (_("Do you want to provide them? (yes/no) [yes] "));
- if (answer && (!nmc_string_to_bool (answer, &answer_bool, NULL) || !answer_bool))
+ if (answer && (!nmc_string_to_bool (answer, &answer_bool, NULL) || !answer_bool)) {
+ g_free (answer);
return;
+ }
if (!*mtu) {
do {
*mtu = nmc_get_user_input (_("MTU [auto]: "));
once_more = !check_and_convert_mtu (*mtu, NULL, &error);
- if (once_more)
+ if (once_more) {
printf ("%s\n", error->message);
- g_clear_error (&error);
+ g_clear_error (&error);
+ g_free (*mtu);
+ }
} while (once_more);
}
if (!*mac) {
do {
*mac = nmc_get_user_input (_("MAC [none]: "));
once_more = !check_and_convert_mac (*mac, NULL, ARPHRD_ETHER, "mac", &error);
- if (once_more)
+ if (once_more) {
printf ("%s\n", error->message);
- g_clear_error (&error);
+ g_clear_error (&error);
+ g_free (*mac);
+ }
} while (once_more);
}
if (!*cloned_mac) {
do {
*cloned_mac = nmc_get_user_input (_("Cloned MAC [none]: "));
once_more = !check_and_convert_mac (*cloned_mac, NULL, ARPHRD_ETHER, "cloned-mac", &error);
- if (once_more)
+ if (once_more) {
printf ("%s\n", error->message);
- g_clear_error (&error);
+ g_clear_error (&error);
+ g_free (*cloned_mac);
+ }
} while (once_more);
}
+ g_free (answer);
return;
}
@@ -2377,25 +2386,31 @@ do_questionnaire_infiniband (char **mtu, char **mac, char **mode, char **parent,
/* Ask for optional arguments */
printf (_("There are 5 optional arguments for 'InfiniBand' connection type.\n"));
answer = nmc_get_user_input (_("Do you want to provide them? (yes/no) [yes] "));
- if (answer && (!nmc_string_to_bool (answer, &answer_bool, NULL) || !answer_bool))
+ if (answer && (!nmc_string_to_bool (answer, &answer_bool, NULL) || !answer_bool)) {
+ g_free (answer);
return;
+ }
if (!*mtu) {
do {
*mtu = nmc_get_user_input (_("MTU [auto]: "));
once_more = !check_and_convert_mtu (*mtu, NULL, &error);
- if (once_more)
+ if (once_more) {
printf ("%s\n", error->message);
- g_clear_error (&error);
+ g_clear_error (&error);
+ g_free (*mtu);
+ }
} while (once_more);
}
if (!*mac) {
do {
*mac = nmc_get_user_input (_("MAC [none]: "));
once_more = !check_and_convert_mac (*mac, NULL, ARPHRD_INFINIBAND, "mac", &error);
- if (once_more)
+ if (once_more) {
printf ("%s\n", error->message);
- g_clear_error (&error);
+ g_clear_error (&error);
+ g_free (*mac);
+ }
} while (once_more);
}
if (!*mode) {
@@ -2404,35 +2419,42 @@ do_questionnaire_infiniband (char **mtu, char **mac, char **mode, char **parent,
if (!*mode)
*mode = g_strdup ("datagram");
once_more = !check_infiniband_mode (*mode, &error);
- if (once_more)
+ if (once_more) {
printf ("%s\n", error->message);
- g_clear_error (&error);
+ g_clear_error (&error);
+ g_free (*mode);
+ }
} while (once_more);
}
if (!*parent) {
do {
*parent = nmc_get_user_input (_("Parent interface [none]: "));
once_more = !check_infiniband_parent (*parent, &error);
- if (once_more)
+ if (once_more) {
printf ("%s\n", error->message);
- g_clear_error (&error);
+ g_clear_error (&error);
+ g_free (*parent);
+ }
} while (once_more);
}
if (!*p_key) {
do {
*p_key = nmc_get_user_input (_("P_KEY [none]: "));
once_more = !check_infiniband_p_key (*p_key, NULL, &error);
- if (once_more)
+ if (once_more) {
printf ("%s\n", error->message);
- g_clear_error (&error);
+ g_clear_error (&error);
+ g_free (*p_key);
+ }
/* If parent is specified, so has to be P_KEY */
- if (*parent && !*p_key) {
+ if (!once_more && *parent && !*p_key) {
once_more = TRUE;
printf (_("Error: 'p-key' is mandatory when 'parent' is specified.\n"));
}
} while (once_more);
}
+ g_free (answer);
return;
}
@@ -2454,19 +2476,24 @@ do_questionnaire_wimax (char **mac)
/* Ask for optional 'wimax' arguments. */
printf (_("There is 1 optional argument for 'WiMax' connection type.\n"));
answer = nmc_get_user_input (_("Do you want to provide it? (yes/no) [yes] "));
- if (answer && (!nmc_string_to_bool (answer, &answer_bool, NULL) || !answer_bool))
+ if (answer && (!nmc_string_to_bool (answer, &answer_bool, NULL) || !answer_bool)) {
+ g_free (answer);
return;
+ }
if (!*mac) {
do {
*mac = nmc_get_user_input (_("MAC [none]: "));
once_more = !check_and_convert_mac (*mac, NULL, ARPHRD_ETHER, "mac", &error);
- if (once_more)
+ if (once_more) {
printf ("%s\n", error->message);
- g_clear_error (&error);
+ g_clear_error (&error);
+ g_free (*mac);
+ }
} while (once_more);
}
+ g_free (answer);
return;
}
@@ -2479,14 +2506,17 @@ do_questionnaire_mobile (char **user, char **password)
/* Ask for optional 'gsm' or 'cdma' arguments. */
printf (_("There are 2 optional arguments for 'mobile broadband' connection type.\n"));
answer = nmc_get_user_input (_("Do you want to provide them? (yes/no) [yes] "));
- if (answer && (!nmc_string_to_bool (answer, &answer_bool, NULL) || !answer_bool))
+ if (answer && (!nmc_string_to_bool (answer, &answer_bool, NULL) || !answer_bool)) {
+ g_free (answer);
return;
+ }
if (!*user)
*user = nmc_get_user_input (_("Username [none]: "));
if (!*password)
*password = nmc_get_user_input (_("Password [none]: "));
+ g_free (answer);
return;
}
@@ -2500,8 +2530,10 @@ do_questionnaire_bluetooth (char **bt_type)
/* Ask for optional 'bluetooth' arguments. */
printf (_("There is 1 optional argument for 'bluetooth' connection type.\n"));
answer = nmc_get_user_input (_("Do you want to provide it? (yes/no) [yes] "));
- if (answer && (!nmc_string_to_bool (answer, &answer_bool, NULL) || !answer_bool))
+ if (answer && (!nmc_string_to_bool (answer, &answer_bool, NULL) || !answer_bool)) {
+ g_free (answer);
return;
+ }
if (!*bt_type) {
do {
@@ -2512,11 +2544,14 @@ do_questionnaire_bluetooth (char **bt_type)
&& strcmp (*bt_type, NM_SETTING_BLUETOOTH_TYPE_DUN"-gsm")
&& strcmp (*bt_type, NM_SETTING_BLUETOOTH_TYPE_DUN"-cdma")
&& strcmp (*bt_type, NM_SETTING_BLUETOOTH_TYPE_PANU);
- if (once_more)
+ if (once_more) {
printf (_("Error: 'bt-type': '%s' is not a valid bluetooth type.\n"), *bt_type);
+ g_free (*bt_type);
+ }
} while (once_more);
}
+ g_free (answer);
return;
}
@@ -2531,46 +2566,57 @@ do_questionnaire_vlan (char **mtu, char **flags, char **ingress, char **egress)
/* Ask for optional 'vlan' arguments. */
printf (_("There are 4 optional arguments for 'VLAN' connection type.\n"));
answer = nmc_get_user_input (_("Do you want to provide them? (yes/no) [yes] "));
- if (answer && (!nmc_string_to_bool (answer, &answer_bool, NULL) || !answer_bool))
+ if (answer && (!nmc_string_to_bool (answer, &answer_bool, NULL) || !answer_bool)) {
+ g_free (answer);
return;
+ }
if (!*mtu) {
do {
*mtu = nmc_get_user_input (_("MTU [auto]: "));
once_more = !check_and_convert_mtu (*mtu, NULL, &error);
- if (once_more)
+ if (once_more) {
printf ("%s\n", error->message);
- g_clear_error (&error);
+ g_clear_error (&error);
+ g_free (*mtu);
+ }
} while (once_more);
}
if (!*flags) {
do {
*flags = nmc_get_user_input (_("VLAN flags (<0-7>) [none]: "));
once_more = !check_and_convert_vlan_flags (*flags, NULL, &error);
- if (once_more)
+ if (once_more) {
printf ("%s\n", error->message);
- g_clear_error (&error);
+ g_clear_error (&error);
+ g_free (*flags);
+ }
} while (once_more);
}
if (!*ingress) {
do {
*ingress = nmc_get_user_input (_("Ingress priority maps [none]: "));
once_more = !check_and_convert_vlan_prio_maps (*ingress, NM_VLAN_INGRESS_MAP, NULL, &error);
- if (once_more)
+ if (once_more) {
printf ("%s\n", error->message);
- g_clear_error (&error);
+ g_clear_error (&error);
+ g_free (*ingress);
+ }
} while (once_more);
}
if (!*egress) {
do {
*egress = nmc_get_user_input (_("Egress priority maps [none]: "));
once_more = !check_and_convert_vlan_prio_maps (*egress, NM_VLAN_EGRESS_MAP, NULL, &error);
- if (once_more)
+ if (once_more) {
printf ("%s\n", error->message);
- g_clear_error (&error);
+ g_clear_error (&error);
+ g_free (*egress);
+ }
} while (once_more);
}
+ g_free (answer);
return;
}
@@ -2587,8 +2633,10 @@ do_questionnaire_bond (char **mode, char **miimon, char **downdelay, char **upde
/* Ask for optional 'bond' arguments. */
printf (_("There are 6 optional arguments for 'bond' connection type.\n"));
answer = nmc_get_user_input (_("Do you want to provide them? (yes/no) [yes] "));
- if (answer && (!nmc_string_to_bool (answer, &answer_bool, NULL) || !answer_bool))
+ if (answer && (!nmc_string_to_bool (answer, &answer_bool, NULL) || !answer_bool)) {
+ g_free (answer);
return;
+ }
if (!*mode) {
const char *mode_tmp;
@@ -2597,48 +2645,57 @@ do_questionnaire_bond (char **mode, char **miimon, char **downdelay, char **upde
if (!*mode)
*mode = g_strdup ("balance-rr");
mode_tmp = nmc_bond_validate_mode (*mode, &error);
+ g_free (*mode);
if (mode_tmp) {
- g_free (*mode);
*mode = g_strdup (mode_tmp);
- } else
+ } else {
printf ("%s\n", error->message);
- g_clear_error (&error);
+ g_clear_error (&error);
+ }
} while (!mode_tmp);
}
if (!*miimon) {
do {
*miimon = nmc_get_user_input (_("Bonding miimon [100]): "));
once_more = *miimon && !nmc_string_to_uint (*miimon, TRUE, 0, G_MAXUINT32, &tmp);
- if (once_more)
+ if (once_more) {
printf (_("Error: 'miimon': '%s' is not a valid number <0-%u>.\n"),
*miimon, G_MAXUINT32);
+ g_free (*miimon);
+ }
} while (once_more);
}
if (!*downdelay) {
do {
*downdelay = nmc_get_user_input (_("Bonding downdelay [0]): "));
once_more = *downdelay && !nmc_string_to_uint (*downdelay, TRUE, 0, G_MAXUINT32, &tmp);
- if (once_more)
+ if (once_more) {
printf (_("Error: 'downdelay': '%s' is not a valid number <0-%u>.\n"),
*downdelay, G_MAXUINT32);
+ g_free (*downdelay);
+ }
} while (once_more);
}
if (!*updelay) {
do {
*updelay = nmc_get_user_input (_("Bonding updelay [0]): "));
once_more = *updelay && !nmc_string_to_uint (*updelay, TRUE, 0, G_MAXUINT32, &tmp);
- if (once_more)
+ if (once_more) {
printf (_("Error: 'updelay': '%s' is not a valid number <0-%u>.\n"),
*updelay, G_MAXUINT32);
+ g_free (*updelay);
+ }
} while (once_more);
}
if (!*arpinterval) {
do {
*arpinterval = nmc_get_user_input (_("Bonding arp-interval [0]): "));
once_more = *arpinterval && !nmc_string_to_uint (*arpinterval, TRUE, 0, G_MAXUINT32, &tmp);
- if (once_more)
+ if (once_more) {
printf (_("Error: 'arp-interval': '%s' is not a valid number <0-%u>.\n"),
*arpinterval, G_MAXUINT32);
+ g_free (*arpinterval);
+ }
} while (once_more);
}
if (!*arpiptarget) {
@@ -2646,6 +2703,7 @@ do_questionnaire_bond (char **mode, char **miimon, char **downdelay, char **upde
*arpiptarget = nmc_get_user_input (_("Bonding arp-ip-target [none]): "));
}
+ g_free (answer);
return;
}
@@ -2662,8 +2720,10 @@ do_questionnaire_bridge (char **stp, char **priority, char **fwd_delay,
/* Ask for optional 'bridge' arguments. */
printf (_("There are 6 optional arguments for 'bridge' connection type.\n"));
answer = nmc_get_user_input (_("Do you want to provide them? (yes/no) [yes] "));
- if (answer && (!nmc_string_to_bool (answer, &answer_bool, NULL) || !answer_bool))
+ if (answer && (!nmc_string_to_bool (answer, &answer_bool, NULL) || !answer_bool)) {
+ g_free (answer);
return;
+ }
if (!*stp) {
gboolean stp_bool;
@@ -2671,9 +2731,11 @@ do_questionnaire_bridge (char **stp, char **priority, char **fwd_delay,
*stp = nmc_get_user_input (_("Enable STP (yes/no) [yes]: "));
*stp = *stp ? *stp : g_strdup ("yes");
once_more = !nmc_string_to_bool (*stp, &stp_bool, &error);
- if (once_more)
+ if (once_more) {
printf (_("Error: 'stp': '%s'.\n"), error->message);
- g_clear_error (&error);
+ g_clear_error (&error);
+ g_free (*stp);
+ }
} while (once_more);
}
if (!*priority) {
@@ -2681,9 +2743,11 @@ do_questionnaire_bridge (char **stp, char **priority, char **fwd_delay,
*priority = nmc_get_user_input (_("STP priority [128]): "));
*priority = *priority ? *priority : g_strdup ("128");
once_more = !nmc_string_to_uint (*priority, TRUE, 0, G_MAXUINT16, &tmp);
- if (once_more)
+ if (once_more) {
printf (_("Error: 'priority': '%s' is not a valid number <0-%d>.\n"),
*priority, G_MAXUINT16);
+ g_free (*priority);
+ }
} while (once_more);
}
if (!*fwd_delay) {
@@ -2691,9 +2755,11 @@ do_questionnaire_bridge (char **stp, char **priority, char **fwd_delay,
*fwd_delay = nmc_get_user_input (_("Forward delay [15]): "));
*fwd_delay = *fwd_delay ? *fwd_delay : g_strdup ("15");
once_more = !nmc_string_to_uint (*fwd_delay, TRUE, 2, 30, &tmp);
- if (once_more)
+ if (once_more) {
printf (_("Error: 'forward-delay': '%s' is not a valid number <2-30>.\n"),
*fwd_delay);
+ g_free (*fwd_delay);
+ }
} while (once_more);
}
@@ -2702,9 +2768,11 @@ do_questionnaire_bridge (char **stp, char **priority, char **fwd_delay,
*hello_time = nmc_get_user_input (_("Hello time [2]): "));
*hello_time = *hello_time ? *hello_time : g_strdup ("2");
once_more = !nmc_string_to_uint (*hello_time, TRUE, 1, 10, &tmp);
- if (once_more)
+ if (once_more) {
printf (_("Error: 'hello-time': '%s' is not a valid number <1-10>.\n"),
*hello_time);
+ g_free (*hello_time);
+ }
} while (once_more);
}
if (!*max_age) {
@@ -2712,9 +2780,11 @@ do_questionnaire_bridge (char **stp, char **priority, char **fwd_delay,
*max_age = nmc_get_user_input (_("Max age [20]): "));
*max_age = *max_age ? *max_age : g_strdup ("20");
once_more = !nmc_string_to_uint (*max_age, TRUE, 6, 40, &tmp);
- if (once_more)
+ if (once_more) {
printf (_("Error: 'max-age': '%s' is not a valid number <6-40>.\n"),
*max_age);
+ g_free (*max_age);
+ }
} while (once_more);
}
if (!*ageing_time) {
@@ -2722,12 +2792,15 @@ do_questionnaire_bridge (char **stp, char **priority, char **fwd_delay,
*ageing_time = nmc_get_user_input (_("MAC address ageing time [300]): "));
*ageing_time = *ageing_time ? *ageing_time : g_strdup ("300");
once_more = !nmc_string_to_uint (*ageing_time, TRUE, 0, 1000000, &tmp);
- if (once_more)
+ if (once_more) {
printf (_("Error: 'ageing-time': '%s' is not a valid number <0-1000000>.\n"),
*ageing_time);
+ g_free (*ageing_time);
+ }
} while (once_more);
}
+ g_free (answer);
return;
}
@@ -2743,8 +2816,10 @@ do_questionnaire_bridge_slave (char **priority, char **path_cost, char **hairpin
/* Ask for optional 'bridge-slave' arguments. */
printf (_("There are 3 optional arguments for 'bridge-slave' connection type.\n"));
answer = nmc_get_user_input (_("Do you want to provide them? (yes/no) [yes] "));
- if (answer && (!nmc_string_to_bool (answer, &answer_bool, NULL) || !answer_bool))
+ if (answer && (!nmc_string_to_bool (answer, &answer_bool, NULL) || !answer_bool)) {
+ g_free (answer);
return;
+ }
if (!*priority) {
do {
@@ -2752,9 +2827,11 @@ do_questionnaire_bridge_slave (char **priority, char **path_cost, char **hairpin
*priority = *priority ? *priority : g_strdup ("32");
once_more = !bridge_prop_string_to_uint (*priority, "priority", NM_TYPE_SETTING_BRIDGE_PORT,
NM_SETTING_BRIDGE_PORT_PRIORITY, &tmp, &error);
- if (once_more)
+ if (once_more) {
printf ("%s\n", error->message);
- g_clear_error (&error);
+ g_clear_error (&error);
+ g_free (*priority);
+ }
} while (once_more);
}
if (!*path_cost) {
@@ -2763,9 +2840,11 @@ do_questionnaire_bridge_slave (char **priority, char **path_cost, char **hairpin
*path_cost = *path_cost ? *path_cost : g_strdup ("100");
once_more = !bridge_prop_string_to_uint (*path_cost, "path-cost", NM_TYPE_SETTING_BRIDGE_PORT,
NM_SETTING_BRIDGE_PORT_PATH_COST, &tmp, &error);
- if (once_more)
+ if (once_more) {
printf ("%s\n", error->message);
- g_clear_error (&error);
+ g_clear_error (&error);
+ g_free (*path_cost);
+ }
} while (once_more);
}
if (!*hairpin) {
@@ -2774,12 +2853,15 @@ do_questionnaire_bridge_slave (char **priority, char **path_cost, char **hairpin
*hairpin = nmc_get_user_input (_("Hairpin (yes/no) [yes]: "));
*hairpin = *hairpin ? *hairpin : g_strdup ("yes");
once_more = !nmc_string_to_bool (*hairpin, &hairpin_bool, &error);
- if (once_more)
+ if (once_more) {
printf (_("Error: 'hairpin': '%s'.\n"), error->message);
- g_clear_error (&error);
+ g_clear_error (&error);
+ g_free (*hairpin);
+ }
} while (once_more);
}
+ g_free (answer);
return;
}
@@ -2792,12 +2874,15 @@ do_questionnaire_vpn (char **user)
/* Ask for optional 'vpn' arguments. */
printf (_("There is 1 optional argument for 'VPN' connection type.\n"));
answer = nmc_get_user_input (_("Do you want to provide it? (yes/no) [yes] "));
- if (answer && (!nmc_string_to_bool (answer, &answer_bool, NULL) || !answer_bool))
+ if (answer && (!nmc_string_to_bool (answer, &answer_bool, NULL) || !answer_bool)) {
+ g_free (answer);
return;
+ }
if (!*user)
*user = nmc_get_user_input (_("Username [none]: "));
+ g_free (answer);
return;
}
@@ -2813,28 +2898,35 @@ do_questionnaire_olpc (char **channel, char **dhcp_anycast)
/* Ask for optional 'olpc' arguments. */
printf (_("There are 2 optional arguments for 'OLPC Mesh' connection type.\n"));
answer = nmc_get_user_input (_("Do you want to provide them? (yes/no) [yes] "));
- if (answer && (!nmc_string_to_bool (answer, &answer_bool, NULL) || !answer_bool))
+ if (answer && (!nmc_string_to_bool (answer, &answer_bool, NULL) || !answer_bool)) {
+ g_free (answer);
return;
+ }
if (!*channel) {
do {
*channel = nmc_get_user_input (_("OLPC Mesh channel [1]): "));
once_more = *channel && !nmc_string_to_uint (*channel, TRUE, 1, 13, &tmp);
- if (once_more)
+ if (once_more) {
printf (_("Error: 'channel': '%s' is not a valid number <1-13>.\n"),
*channel);
+ g_free (*channel);
+ }
} while (once_more);
}
if (!*dhcp_anycast) {
do {
*dhcp_anycast = nmc_get_user_input (_("DHCP anycast MAC address [none]: "));
once_more = !check_and_convert_mac (*dhcp_anycast, NULL, ARPHRD_ETHER, "dhcp-anycast", &error);
- if (once_more)
+ if (once_more) {
printf ("%s\n", error->message);
- g_clear_error (&error);
+ g_clear_error (&error);
+ g_free (*dhcp_anycast);
+ }
} while (once_more);
}
+ g_free (answer);
return;
}
@@ -2917,14 +3009,17 @@ do_questionnaire_ip (NMConnection *connection)
/* Ask for IP addresses */
answer = nmc_get_user_input (_("Do you want to add IP addresses? (yes/no) [yes] "));
- if (answer && (!nmc_string_to_bool (answer, &answer_bool, NULL) || !answer_bool))
+ if (answer && (!nmc_string_to_bool (answer, &answer_bool, NULL) || !answer_bool)) {
+ g_free (answer);
return;
+ }
printf (_("Press <Enter> to finish adding addresses.\n"));
ask_for_ip_addresses (connection, 4);
ask_for_ip_addresses (connection, 6);
+ g_free (answer);
return;
}