summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2017-02-21 11:23:01 +0100
committerThomas Haller <thaller@redhat.com>2017-02-21 12:17:30 +0100
commitb1c8c9cbaf54b7ee076e99db29c6e5127944d4f2 (patch)
tree6b99c8a02aff6e7ab64a7193e1a781f997cef55e
parent19c9d1bafda1ff7eb75a96b4eebc5b8544f06137 (diff)
downloadNetworkManager-b1c8c9cbaf54b7ee076e99db29c6e5127944d4f2.tar.gz
ifcfg: return early on error using cleanup attributes in reader
-rw-r--r--src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c311
1 files changed, 119 insertions, 192 deletions
diff --git a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c
index e83b933dd7..b60ef82f4d 100644
--- a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c
+++ b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c
@@ -948,9 +948,9 @@ make_ip4_setting (shvarFile *ifcfg,
gboolean *out_has_defroute,
GError **error)
{
- NMSettingIPConfig *s_ip4 = NULL;
+ gs_unref_object NMSettingIPConfig *s_ip4 = NULL;
+ gs_free char *route_path = NULL;
char *value = NULL;
- char *route_path = NULL;
char *method;
gs_free char *dns_options_free = NULL;
const char *dns_options = NULL;
@@ -1033,9 +1033,9 @@ make_ip4_setting (shvarFile *ifcfg,
NMIPAddress *addr = NULL;
if (!read_full_ip4_address (ifcfg, idx, NULL, &addr, NULL, error))
- goto done;
+ return NULL;
if (!read_ip4_address (ifcfg, "GATEWAY", NULL, &gw, error))
- goto done;
+ return NULL;
(void) nm_setting_ip_config_add_address (s_ip4, addr);
nm_ip_address_unref (addr);
if (never_default)
@@ -1043,12 +1043,12 @@ make_ip4_setting (shvarFile *ifcfg,
gateway = g_strdup (nm_utils_inet4_ntop (gw, inet_buf));
g_object_set (s_ip4, NM_SETTING_IP_CONFIG_GATEWAY, gateway, NULL);
}
- return NM_SETTING (s_ip4);
+ return g_steal_pointer (&s_ip4);
} else {
g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
"Unknown BOOTPROTO '%s'", value);
g_free (value);
- goto done;
+ return NULL;
}
g_free (value);
@@ -1063,7 +1063,7 @@ make_ip4_setting (shvarFile *ifcfg,
NULL);
if (strcmp (method, NM_SETTING_IP4_CONFIG_METHOD_DISABLED) == 0)
- return NM_SETTING (s_ip4);
+ return g_steal_pointer (&s_ip4);
/* Handle DHCP settings */
value = svGetValueString (ifcfg, "DHCP_HOSTNAME");
@@ -1103,7 +1103,7 @@ make_ip4_setting (shvarFile *ifcfg,
/* gateway will only be set if still unset. Hence, we don't leak gateway
* here by calling read_full_ip4_address() repeatedly */
if (!read_full_ip4_address (ifcfg, i, NULL, &addr, &gateway, error))
- goto done;
+ return NULL;
if (!addr) {
/* The first mandatory variable is 2-indexed (IPADDR2)
@@ -1127,7 +1127,7 @@ make_ip4_setting (shvarFile *ifcfg,
read_success = read_ip4_address (network_ifcfg, "GATEWAY", &has_key, &a, error);
svCloseFile (network_ifcfg);
if (!read_success)
- goto done;
+ return NULL;
if (has_key) {
if (nm_setting_ip_config_get_num_addresses (s_ip4) == 0) {
gs_free char *f = g_path_get_basename (svFileGetName (ifcfg));
@@ -1160,7 +1160,7 @@ make_ip4_setting (shvarFile *ifcfg,
} else {
PARSE_WARNING ("invalid DNS server address %s", value);
g_free (value);
- goto done;
+ return NULL;
}
g_free (value);
@@ -1212,7 +1212,7 @@ make_ip4_setting (shvarFile *ifcfg,
if (!read_one_ip4_route (route_ifcfg, i, &route, error)) {
svCloseFile (route_ifcfg);
- goto done;
+ return NULL;
}
if (!route)
@@ -1226,9 +1226,8 @@ make_ip4_setting (shvarFile *ifcfg,
}
} else {
if (!read_route_file_legacy (route_path, s_ip4, error))
- goto done;
+ return NULL;
}
- g_free (route_path);
/* Legacy value NM used for a while but is incorrect (rh #459370) */
if (!nm_setting_ip_config_get_num_dns_searches (s_ip4)) {
@@ -1256,12 +1255,7 @@ make_ip4_setting (shvarFile *ifcfg,
g_object_set (s_ip4, NM_SETTING_IP_CONFIG_DAD_TIMEOUT,
(gint) (timeout <= 0 ? timeout : timeout * 1000), NULL);
- return NM_SETTING (s_ip4);
-
-done:
- g_free (route_path);
- g_object_unref (s_ip4);
- return NULL;
+ return g_steal_pointer (&s_ip4);
}
static void
@@ -1823,8 +1817,7 @@ read_dcb_bool_array (shvarFile *ifcfg,
DcbSetBoolFunc set_func,
GError **error)
{
- char *val;
- gboolean success = FALSE;
+ gs_free char *val = NULL;
guint i;
val = svGetValueString (ifcfg, prop);
@@ -1833,8 +1826,7 @@ read_dcb_bool_array (shvarFile *ifcfg,
if (!(flags & NM_SETTING_DCB_FLAG_ENABLE)) {
PARSE_WARNING ("ignoring %s; %s is not enabled", prop, desc);
- success = TRUE;
- goto out;
+ return TRUE;
}
val = g_strstrip (val);
@@ -1842,7 +1834,7 @@ read_dcb_bool_array (shvarFile *ifcfg,
PARSE_WARNING ("%s value '%s' must be 8 characters long", prop, val);
g_set_error_literal (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
"boolean array must be 8 characters");
- goto out;
+ return FALSE;
}
/* All characters must be either 0 or 1 */
@@ -1851,15 +1843,11 @@ read_dcb_bool_array (shvarFile *ifcfg,
PARSE_WARNING ("invalid %s value '%s': not all 0s and 1s", prop, val);
g_set_error_literal (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
"invalid boolean digit");
- goto out;
+ return FALSE;
}
set_func (s_dcb, i, (val[i] == '1'));
}
- success = TRUE;
-
-out:
- g_free (val);
- return success;
+ return TRUE;
}
typedef void (*DcbSetUintFunc) (NMSettingDcb *, guint, guint);
@@ -1874,8 +1862,7 @@ read_dcb_uint_array (shvarFile *ifcfg,
DcbSetUintFunc set_func,
GError **error)
{
- char *val;
- gboolean success = FALSE;
+ gs_free char *val = NULL;
guint i;
val = svGetValueString (ifcfg, prop);
@@ -1884,8 +1871,7 @@ read_dcb_uint_array (shvarFile *ifcfg,
if (!(flags & NM_SETTING_DCB_FLAG_ENABLE)) {
PARSE_WARNING ("ignoring %s; %s is not enabled", prop, desc);
- success = TRUE;
- goto out;
+ return TRUE;
}
val = g_strstrip (val);
@@ -1893,7 +1879,7 @@ read_dcb_uint_array (shvarFile *ifcfg,
PARSE_WARNING ("%s value '%s' must be 8 characters long", prop, val);
g_set_error_literal (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
"uint array must be 8 characters");
- goto out;
+ return FALSE;
}
/* All characters must be either 0 - 7 or (optionally) f */
@@ -1907,14 +1893,11 @@ read_dcb_uint_array (shvarFile *ifcfg,
prop, val, f_allowed ? " or 'f'" : "");
g_set_error_literal (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
"invalid uint digit");
- goto out;
+ return FALSE;
}
}
- success = TRUE;
-out:
- g_free (val);
- return success;
+ return TRUE;
}
static gboolean
@@ -1927,9 +1910,9 @@ read_dcb_percent_array (shvarFile *ifcfg,
DcbSetUintFunc set_func,
GError **error)
{
- char *val;
- gboolean success = FALSE;
- char **split = NULL, **iter;
+ gs_free char *val = NULL;
+ gs_strfreev char **split = NULL;
+ char **iter;
guint i, sum = 0;
val = svGetValueString (ifcfg, prop);
@@ -1938,8 +1921,7 @@ read_dcb_percent_array (shvarFile *ifcfg,
if (!(flags & NM_SETTING_DCB_FLAG_ENABLE)) {
PARSE_WARNING ("ignoring %s; %s is not enabled", prop, desc);
- success = TRUE;
- goto out;
+ return TRUE;
}
val = g_strstrip (val);
@@ -1948,7 +1930,7 @@ read_dcb_percent_array (shvarFile *ifcfg,
PARSE_WARNING ("invalid %s percentage list value '%s'", prop, val);
g_set_error_literal (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
"percent array must be 8 elements");
- goto out;
+ return FALSE;
}
for (iter = split, i = 0; iter && *iter; iter++, i++) {
@@ -1959,7 +1941,7 @@ read_dcb_percent_array (shvarFile *ifcfg,
PARSE_WARNING ("invalid %s percentage value '%s'", prop, *iter);
g_set_error_literal (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
"invalid percent element");
- goto out;
+ return FALSE;
}
set_func (s_dcb, i, (guint) tmp);
sum += (guint) tmp;
@@ -1969,16 +1951,10 @@ read_dcb_percent_array (shvarFile *ifcfg,
PARSE_WARNING ("%s percentages do not equal 100%%", prop);
g_set_error_literal (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
"invalid percentage sum");
- goto out;
+ return FALSE;
}
- success = TRUE;
-
-out:
- if (split)
- g_strfreev (split);
- g_free (val);
- return success;
+ return TRUE;;
}
static gboolean
@@ -2272,7 +2248,7 @@ make_wep_setting (shvarFile *ifcfg,
const char *file,
GError **error)
{
- NMSettingWirelessSecurity *s_wsec;
+ gs_unref_object NMSettingWirelessSecurity *s_wsec = NULL;
char *value;
shvarFile *keys_ifcfg = NULL;
int default_key_idx = 0;
@@ -2289,7 +2265,7 @@ make_wep_setting (shvarFile *ifcfg,
g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
"Invalid default WEP key '%s'", value);
g_free (value);
- goto error;
+ return NULL;
}
has_default_key = TRUE;
default_key_idx--; /* convert to [0...3] */
@@ -2304,14 +2280,14 @@ make_wep_setting (shvarFile *ifcfg,
/* Read keys in the ifcfg file if they are system-owned */
if (key_flags == NM_SETTING_SECRET_FLAG_NONE) {
if (!read_wep_keys (ifcfg, default_key_idx, s_wsec, error))
- goto error;
+ return NULL;
/* Try to get keys from the "shadow" key file */
keys_ifcfg = utils_get_keys_ifcfg (file, FALSE);
if (keys_ifcfg) {
if (!read_wep_keys (keys_ifcfg, default_key_idx, s_wsec, error)) {
svCloseFile (keys_ifcfg);
- goto error;
+ return NULL;
}
svCloseFile (keys_ifcfg);
g_assert (error == NULL || *error == NULL);
@@ -2334,7 +2310,7 @@ make_wep_setting (shvarFile *ifcfg,
"Invalid WEP authentication algorithm '%s'",
lcase);
g_free (lcase);
- goto error;
+ return NULL;
}
g_free (lcase);
}
@@ -2355,20 +2331,14 @@ make_wep_setting (shvarFile *ifcfg,
g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
"WEP Shared Key authentication is invalid for "
"unencrypted connections.");
- goto error;
+ return NULL;
}
/* Unencrypted */
- g_object_unref (s_wsec);
- s_wsec = NULL;
+ return NULL;
}
- return (NMSetting *) s_wsec;
-
-error:
- if (s_wsec)
- g_object_unref (s_wsec);
- return NULL;
+ return g_steal_pointer (&s_wsec);
}
static gboolean
@@ -2572,15 +2542,12 @@ eap_tls_reader (const char *eap_method,
gboolean phase2,
GError **error)
{
+ gs_free char *ca_cert = NULL;
+ gs_free char *privkey = NULL;
+ gs_free char *privkey_password = NULL;
char *value;
- char *ca_cert = NULL;
char *ca_cert_password = NULL;
- char *real_cert_value = NULL;
- char *client_cert = NULL;
char *client_cert_password = NULL;
- char *privkey = NULL;
- char *privkey_password = NULL;
- gboolean success = FALSE;
NMSetting8021xCKFormat privkey_format = NM_SETTING_802_1X_CK_FORMAT_UNKNOWN;
const char *ca_cert_key = phase2 ? "IEEE_8021X_INNER_CA_CERT" : "IEEE_8021X_CA_CERT";
const char *ca_cert_pw_key = phase2 ? "IEEE_8021X_INNER_CA_CERT_PASSWORD" : "IEEE_8021X_CA_CERT_PASSWORD";
@@ -2607,16 +2574,16 @@ eap_tls_reader (const char *eap_method,
ca_cert = svGetValueString (ifcfg, ca_cert_key);
if (ca_cert) {
+ gs_free char *real_cert_value = NULL;
+
real_cert_value = get_cert_value (svFileGetName (ifcfg), ca_cert, &scheme);
if (phase2) {
if (!nm_setting_802_1x_set_phase2_ca_cert (s_8021x, real_cert_value, scheme, NULL, error))
- goto done;
+ return FALSE;
} else {
if (!nm_setting_802_1x_set_ca_cert (s_8021x, real_cert_value, scheme, NULL, error))
- goto done;
+ return FALSE;
}
- g_free (real_cert_value);
- real_cert_value = NULL;
if (scheme == NM_SETTING_802_1X_CK_SCHEME_PKCS11) {
flags = read_secret_flags (ifcfg, ca_cert_pw_flags_key);
@@ -2650,7 +2617,7 @@ eap_tls_reader (const char *eap_method,
"Missing %s for EAP method '%s'.",
pk_pw_key,
eap_method);
- goto done;
+ return FALSE;
}
}
@@ -2661,29 +2628,31 @@ eap_tls_reader (const char *eap_method,
"Missing %s for EAP method '%s'.",
pk_key,
eap_method);
- goto done;
+ return FALSE;
}
- real_cert_value = get_cert_value (svFileGetName (ifcfg), privkey, &scheme);
- if (phase2) {
- if (!nm_setting_802_1x_set_phase2_private_key (s_8021x,
- real_cert_value,
- privkey_password,
- scheme,
- &privkey_format,
- error))
- goto done;
- } else {
- if (!nm_setting_802_1x_set_private_key (s_8021x,
- real_cert_value,
- privkey_password,
- scheme,
- &privkey_format,
- error))
- goto done;
+ {
+ gs_free char *real_cert_value = NULL;
+
+ real_cert_value = get_cert_value (svFileGetName (ifcfg), privkey, &scheme);
+ if (phase2) {
+ if (!nm_setting_802_1x_set_phase2_private_key (s_8021x,
+ real_cert_value,
+ privkey_password,
+ scheme,
+ &privkey_format,
+ error))
+ return FALSE;
+ } else {
+ if (!nm_setting_802_1x_set_private_key (s_8021x,
+ real_cert_value,
+ privkey_password,
+ scheme,
+ &privkey_format,
+ error))
+ return FALSE;
+ }
}
- g_free (real_cert_value);
- real_cert_value = NULL;
/* Only set the client certificate if the private key is not PKCS#12 format,
* as NM (due to supplicant restrictions) requires. If the key was PKCS#12,
@@ -2692,25 +2661,26 @@ eap_tls_reader (const char *eap_method,
*/
if ( privkey_format == NM_SETTING_802_1X_CK_FORMAT_RAW_KEY
|| privkey_format == NM_SETTING_802_1X_CK_FORMAT_X509) {
+ gs_free char *real_cert_value = NULL;
+ gs_free char *client_cert = NULL;
+
client_cert = svGetValueString (ifcfg, cli_cert_key);
if (!client_cert) {
g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
"Missing %s for EAP method '%s'.",
cli_cert_key,
eap_method);
- goto done;
+ return FALSE;
}
real_cert_value = get_cert_value (svFileGetName (ifcfg), client_cert, &scheme);
if (phase2) {
if (!nm_setting_802_1x_set_phase2_client_cert (s_8021x, real_cert_value, scheme, NULL, error))
- goto done;
+ return FALSE;
} else {
if (!nm_setting_802_1x_set_client_cert (s_8021x, real_cert_value, scheme, NULL, error))
- goto done;
+ return FALSE;
}
- g_free (real_cert_value);
- real_cert_value = NULL;
if (scheme == NM_SETTING_802_1X_CK_SCHEME_PKCS11) {
flags = read_secret_flags (ifcfg, cli_cert_pw_flags_key);
@@ -2723,15 +2693,7 @@ eap_tls_reader (const char *eap_method,
}
}
- success = TRUE;
-
-done:
- g_free (real_cert_value);
- g_free (ca_cert);
- g_free (client_cert);
- g_free (privkey);
- g_free (privkey_password);
- return success;
+ return TRUE;
}
static gboolean
@@ -3083,8 +3045,8 @@ fill_8021x (shvarFile *ifcfg,
gboolean wifi,
GError **error)
{
+ nm_auto_shvar_file_close shvarFile *keys = NULL;
NMSetting8021x *s_8021x;
- shvarFile *keys = NULL;
char *value;
char **list = NULL, **iter;
gint64 timeout;
@@ -3193,15 +3155,11 @@ fill_8021x (shvarFile *ifcfg,
if (list)
g_strfreev (list);
- if (keys)
- svCloseFile (keys);
return s_8021x;
error:
if (list)
g_strfreev (list);
- if (keys)
- svCloseFile (keys);
g_object_unref (s_8021x);
return NULL;
}
@@ -4301,16 +4259,16 @@ make_bond_setting (shvarFile *ifcfg,
NMSettingBond *s_bond;
char *value;
- s_bond = NM_SETTING_BOND (nm_setting_bond_new ());
-
value = svGetValueString (ifcfg, "DEVICE");
if (!value) {
g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
"mandatory DEVICE keyword missing");
- goto error;
+ return NULL;
}
g_free (value);
+ s_bond = NM_SETTING_BOND (nm_setting_bond_new ());
+
value = svGetValueString (ifcfg, "BONDING_OPTS");
if (value) {
char **items, **iter;
@@ -4336,10 +4294,6 @@ make_bond_setting (shvarFile *ifcfg,
}
return (NMSetting *) s_bond;
-
-error:
- g_object_unref (s_bond);
- return NULL;
}
static NMConnection *
@@ -4423,29 +4377,26 @@ make_team_setting (shvarFile *ifcfg,
char *value;
GError *local_err = NULL;
- s_team = NM_SETTING_TEAM (nm_setting_team_new ());
-
value = svGetValueString (ifcfg, "DEVICE");
if (!value) {
g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
"mandatory DEVICE keyword missing");
- goto error;
+ return NULL;
}
g_free (value);
value = read_team_config (ifcfg, "TEAM_CONFIG", &local_err);
if (local_err) {
g_propagate_error (error, local_err);
- goto error;
+ return NULL;
}
+
+ s_team = NM_SETTING_TEAM (nm_setting_team_new ());
+
g_object_set (s_team, NM_SETTING_TEAM_CONFIG, value, NULL);
g_free (value);
return (NMSetting *) s_team;
-
-error:
- g_object_unref (s_team);
- return NULL;
}
static NMConnection *
@@ -4580,16 +4531,16 @@ make_bridge_setting (shvarFile *ifcfg,
gboolean stp = FALSE;
gboolean stp_set = FALSE;
- s_bridge = NM_SETTING_BRIDGE (nm_setting_bridge_new ());
-
value = svGetValueString (ifcfg, "DEVICE");
if (!value) {
g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
"mandatory DEVICE keyword missing");
- goto error;
+ return NULL;
}
g_free (value);
+ s_bridge = NM_SETTING_BRIDGE (nm_setting_bridge_new ());
+
value = svGetValueString (ifcfg, "MACADDR");
if (value) {
value = g_strstrip (value);
@@ -4635,10 +4586,6 @@ make_bridge_setting (shvarFile *ifcfg,
}
return (NMSetting *) s_bridge;
-
-error:
- g_object_unref (s_bridge);
- return NULL;
}
static NMConnection *
@@ -4817,10 +4764,10 @@ make_vlan_setting (shvarFile *ifcfg,
const char *file,
GError **error)
{
- NMSettingVlan *s_vlan = NULL;
+ gs_unref_object NMSettingVlan *s_vlan = NULL;
+ gs_free char *parent = NULL;
+ gs_free char *iface_name = NULL;
char *value = NULL;
- char *iface_name = NULL;
- char *parent = NULL;
const char *p = NULL;
int vlan_id = -1;
guint32 vlan_flags = 0;
@@ -4861,8 +4808,7 @@ make_vlan_setting (shvarFile *ifcfg,
/* Like initscripts, if no PHYSDEV and we get an obviously
* invalid parent interface from DEVICE, fail.
*/
- g_free (parent);
- parent = NULL;
+ nm_clear_g_free (&parent);
}
}
p++;
@@ -4887,17 +4833,16 @@ make_vlan_setting (shvarFile *ifcfg,
if (vlan_id < 0) {
g_set_error_literal (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
"Failed to determine VLAN ID from DEVICE or VLAN_ID.");
- goto error;
+ return NULL;
}
g_object_set (s_vlan, NM_SETTING_VLAN_ID, vlan_id, NULL);
if (parent == NULL) {
g_set_error_literal (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
"Failed to determine VLAN parent from DEVICE or PHYSDEV");
- goto error;
+ return NULL;
}
g_object_set (s_vlan, NM_SETTING_VLAN_PARENT, parent, NULL);
- g_clear_pointer (&parent, g_free);
vlan_flags |= NM_VLAN_FLAG_REORDER_HEADERS;
@@ -4936,15 +4881,7 @@ make_vlan_setting (shvarFile *ifcfg,
parse_prio_map_list (s_vlan, ifcfg, "VLAN_INGRESS_PRIORITY_MAP", NM_VLAN_INGRESS_MAP);
parse_prio_map_list (s_vlan, ifcfg, "VLAN_EGRESS_PRIORITY_MAP", NM_VLAN_EGRESS_MAP);
- g_free (iface_name);
-
- return (NMSetting *) s_vlan;
-
-error:
- g_free (parent);
- g_free (iface_name);
- g_object_unref (s_vlan);
- return NULL;
+ return g_steal_pointer (&s_vlan);
}
static NMConnection *
@@ -5107,8 +5044,8 @@ connection_from_file_full (const char *filename,
GError **error,
gboolean *out_ignore_error)
{
- NMConnection *connection = NULL;
- shvarFile *parsed;
+ nm_auto_shvar_file_close shvarFile *parsed = NULL;
+ gs_unref_object NMConnection *connection = NULL;
gs_free char *type = NULL;
char *devtype, *bootproto;
NMSetting *s_ip4, *s_ip6, *s_proxy, *s_port, *s_dcb = NULL;
@@ -5135,10 +5072,11 @@ connection_from_file_full (const char *filename,
if (!svGetValueBoolean (parsed, "NM_CONTROLLED", TRUE)) {
connection = create_unhandled_connection (filename, parsed, "unmanaged", out_unhandled);
- if (!connection)
+ if (!connection) {
g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_FAILED,
"NM_CONTROLLED was false but device was not uniquely identified; device will be managed");
- goto done;
+ }
+ return g_steal_pointer (&connection);
}
/* iBFT is handled by the iBFT settings plugin */
@@ -5149,7 +5087,7 @@ connection_from_file_full (const char *filename,
g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
"Ignoring iBFT configuration");
g_free (bootproto);
- goto done;
+ return NULL;
}
g_free (bootproto);
@@ -5184,14 +5122,14 @@ connection_from_file_full (const char *filename,
*out_ignore_error = TRUE;
g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
"Ignoring unsupported connection due to IPV6TUNNELIPV4");
- goto done;
+ return NULL;
}
device = svGetValueString (parsed, "DEVICE");
if (!device) {
g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
"File '%s' had neither TYPE nor DEVICE keys.", filename);
- goto done;
+ return NULL;
}
g_assert (device[0]);
@@ -5201,7 +5139,7 @@ connection_from_file_full (const char *filename,
g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
"Ignoring loopback device config.");
g_free (device);
- goto done;
+ return NULL;
}
if (!test_type) {
@@ -5249,7 +5187,7 @@ connection_from_file_full (const char *filename,
g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
"Ignore script for unknown device type which has a matching %s script",
p_path);
- goto done;
+ return NULL;
}
}
@@ -5277,7 +5215,7 @@ connection_from_file_full (const char *filename,
strcasecmp (type, TYPE_BOND)) {
g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
"BONDING_MASTER=yes key only allowed in TYPE=bond connections");
- goto done;
+ return NULL;
}
/* Construct the connection */
@@ -5299,26 +5237,22 @@ connection_from_file_full (const char *filename,
connection = create_unhandled_connection (filename, parsed, "unrecognized", out_unhandled);
if (!connection)
PARSE_WARNING ("connection type was unrecognized but device was not uniquely identified; device may be managed");
- goto done;
+ return g_steal_pointer (&connection);
}
if (!connection)
- goto done;
+ return NULL;
s_ip6 = make_ip6_setting (parsed, network_file, error);
- if (!s_ip6) {
- g_object_unref (connection);
- connection = NULL;
- goto done;
- } else
+ if (!s_ip6)
+ return NULL;
+ else
nm_connection_add_setting (connection, s_ip6);
s_ip4 = make_ip4_setting (parsed, network_file, &has_ip4_defroute, error);
- if (!s_ip4) {
- g_object_unref (connection);
- connection = NULL;
- goto done;
- } else {
+ if (!s_ip4)
+ return NULL;
+ else {
read_aliases (NM_SETTING_IP_CONFIG (s_ip4),
!has_ip4_defroute && !nm_setting_ip_config_get_gateway (NM_SETTING_IP_CONFIG (s_ip4)),
filename);
@@ -5345,22 +5279,15 @@ connection_from_file_full (const char *filename,
if (s_port)
nm_connection_add_setting (connection, s_port);
- if (!make_dcb_setting (parsed, network_file, &s_dcb, error)) {
- g_object_unref (connection);
- connection = NULL;
- goto done;
- }
+ if (!make_dcb_setting (parsed, network_file, &s_dcb, error))
+ return NULL;
if (s_dcb)
nm_connection_add_setting (connection, s_dcb);
- if (!nm_connection_normalize (connection, NULL, NULL, error)) {
- g_object_unref (connection);
- connection = NULL;
- }
+ if (!nm_connection_normalize (connection, NULL, NULL, error))
+ return NULL;
-done:
- svCloseFile (parsed);
- return connection;
+ return g_steal_pointer (&connection);
}
NMConnection *