diff options
Diffstat (limited to 'libnm-core/nm-keyfile-writer.c')
| -rw-r--r-- | libnm-core/nm-keyfile-writer.c | 107 |
1 files changed, 53 insertions, 54 deletions
diff --git a/libnm-core/nm-keyfile-writer.c b/libnm-core/nm-keyfile-writer.c index e0e6ba4b..3a7007d9 100644 --- a/libnm-core/nm-keyfile-writer.c +++ b/libnm-core/nm-keyfile-writer.c @@ -73,19 +73,25 @@ write_array_of_uint (GKeyFile *file, const GValue *value) { GArray *array; - int i; - int *tmp_array; + guint i; + gs_free int *tmp_array = NULL; array = (GArray *) g_value_get_boxed (value); if (!array || !array->len) return; + g_return_if_fail (g_array_get_element_size (array) == sizeof (guint)); + tmp_array = g_new (gint, array->len); - for (i = 0; i < array->len; i++) - tmp_array[i] = g_array_index (array, int, i); + for (i = 0; i < array->len; i++) { + guint v = g_array_index (array, guint, i); + + if (v > G_MAXINT) + g_return_if_reached (); + tmp_array[i] = (int) v; + } nm_keyfile_plugin_kf_set_integer_list (file, nm_setting_get_name (setting), key, tmp_array, array->len); - g_free (tmp_array); } static void @@ -294,9 +300,8 @@ ssid_writer (KeyfileWriterInfo *info, gsize ssid_len; const char *setting_name = nm_setting_get_name (setting); gboolean new_format = TRUE; - unsigned int semicolons = 0; - int i, *tmp_array; - char *ssid; + gsize semicolons = 0; + gsize i; g_return_if_fail (G_VALUE_HOLDS (value, G_TYPE_BYTES)); @@ -304,14 +309,17 @@ ssid_writer (KeyfileWriterInfo *info, if (!bytes) return; ssid_data = g_bytes_get_data (bytes, &ssid_len); - if (ssid_len == 0) + if (!ssid_data || !ssid_len) { + nm_keyfile_plugin_kf_set_string (info->keyfile, setting_name, key, ""); return; + } /* Check whether each byte is printable. If not, we have to use an * integer list, otherwise we can just use a string. */ for (i = 0; i < ssid_len; i++) { - char c = ssid_data[i] & 0xFF; + const char c = ssid_data[i]; + if (!g_ascii_isprint (c)) { new_format = FALSE; break; @@ -321,28 +329,26 @@ ssid_writer (KeyfileWriterInfo *info, } if (new_format) { - ssid = g_malloc0 (ssid_len + semicolons + 1); + gs_free char *ssid = NULL; + if (semicolons == 0) - memcpy (ssid, ssid_data, ssid_len); + ssid = g_strndup ((char *) ssid_data, ssid_len); else { /* Escape semicolons with backslashes to make strings * containing ';', such as '16;17;' unambiguous */ - int j = 0; + gsize j = 0; + + ssid = g_malloc (ssid_len + semicolons + 1); for (i = 0; i < ssid_len; i++) { if (ssid_data[i] == ';') ssid[j++] = '\\'; ssid[j++] = ssid_data[i]; } + ssid[j] = '\0'; } nm_keyfile_plugin_kf_set_string (info->keyfile, setting_name, key, ssid); - g_free (ssid); - } else { - tmp_array = g_new (gint, ssid_len); - for (i = 0; i < ssid_len; i++) - tmp_array[i] = (int) ssid_data[i]; - nm_keyfile_plugin_kf_set_integer_list (info->keyfile, setting_name, key, tmp_array, ssid_len); - g_free (tmp_array); - } + } else + nm_keyfile_plugin_kf_set_integer_list_uint8 (info->keyfile, setting_name, key, ssid_data, ssid_len); } static void @@ -353,9 +359,8 @@ password_raw_writer (KeyfileWriterInfo *info, { const char *setting_name = nm_setting_get_name (setting); GBytes *array; - int *tmp_array; - gsize i, len; - const char *data; + gsize len; + const guint8 *data; g_return_if_fail (G_VALUE_HOLDS (value, G_TYPE_BYTES)); @@ -363,14 +368,9 @@ password_raw_writer (KeyfileWriterInfo *info, if (!array) return; data = g_bytes_get_data (array, &len); - if (!data || !len) - return; - - tmp_array = g_new (gint, len); - for (i = 0; i < len; i++) - tmp_array[i] = (int) data[i]; - nm_keyfile_plugin_kf_set_integer_list (info->keyfile, setting_name, key, tmp_array, len); - g_free (tmp_array); + if (!data) + len = 0; + nm_keyfile_plugin_kf_set_integer_list_uint8 (info->keyfile, setting_name, key, data, len); } typedef struct ObjectType { @@ -380,6 +380,7 @@ typedef struct ObjectType { NMSetting8021xCKFormat (*format_func) (NMSetting8021x *setting); const char * (*path_func) (NMSetting8021x *setting); GBytes * (*blob_func) (NMSetting8021x *setting); + const char * (*uri_func) (NMSetting8021x *setting); } ObjectType; static const ObjectType objtypes[10] = { @@ -388,47 +389,53 @@ static const ObjectType objtypes[10] = { nm_setting_802_1x_get_ca_cert_scheme, NULL, nm_setting_802_1x_get_ca_cert_path, - nm_setting_802_1x_get_ca_cert_blob }, + nm_setting_802_1x_get_ca_cert_blob, + nm_setting_802_1x_get_ca_cert_uri }, { NM_SETTING_802_1X_PHASE2_CA_CERT, "inner-ca-cert", nm_setting_802_1x_get_phase2_ca_cert_scheme, NULL, nm_setting_802_1x_get_phase2_ca_cert_path, - nm_setting_802_1x_get_phase2_ca_cert_blob }, + nm_setting_802_1x_get_phase2_ca_cert_blob, + nm_setting_802_1x_get_phase2_ca_cert_uri }, { NM_SETTING_802_1X_CLIENT_CERT, "client-cert", nm_setting_802_1x_get_client_cert_scheme, NULL, nm_setting_802_1x_get_client_cert_path, - nm_setting_802_1x_get_client_cert_blob }, + nm_setting_802_1x_get_client_cert_blob, + nm_setting_802_1x_get_client_cert_uri }, { NM_SETTING_802_1X_PHASE2_CLIENT_CERT, "inner-client-cert", nm_setting_802_1x_get_phase2_client_cert_scheme, NULL, nm_setting_802_1x_get_phase2_client_cert_path, - nm_setting_802_1x_get_phase2_client_cert_blob }, + nm_setting_802_1x_get_phase2_client_cert_blob, + nm_setting_802_1x_get_phase2_client_cert_uri }, { NM_SETTING_802_1X_PRIVATE_KEY, "private-key", nm_setting_802_1x_get_private_key_scheme, nm_setting_802_1x_get_private_key_format, nm_setting_802_1x_get_private_key_path, - nm_setting_802_1x_get_private_key_blob }, + nm_setting_802_1x_get_private_key_blob, + nm_setting_802_1x_get_private_key_uri }, { NM_SETTING_802_1X_PHASE2_PRIVATE_KEY, "inner-private-key", nm_setting_802_1x_get_phase2_private_key_scheme, nm_setting_802_1x_get_phase2_private_key_format, nm_setting_802_1x_get_phase2_private_key_path, - nm_setting_802_1x_get_phase2_private_key_blob }, + nm_setting_802_1x_get_phase2_private_key_blob, + nm_setting_802_1x_get_phase2_private_key_uri }, { NULL }, }; -/**************************************************************************/ +/*****************************************************************************/ static void cert_writer_default (NMConnection *connection, @@ -487,6 +494,9 @@ cert_writer_default (NMConnection *connection, nm_keyfile_plugin_kf_set_string (file, setting_name, cert_data->property_name, val); g_free (val); g_free (blob_base64); + } else if (scheme == NM_SETTING_802_1X_CK_SCHEME_PKCS11) { + nm_keyfile_plugin_kf_set_string (file, setting_name, cert_data->property_name, + cert_data->uri_func (cert_data->setting)); } else { /* scheme_func() returns UNKNOWN in all other cases. The only valid case * where a scheme is allowed to be UNKNOWN, is unsetting the value. In this @@ -524,6 +534,7 @@ cert_writer (KeyfileWriterInfo *info, type_data.format_func = objtype->format_func; type_data.path_func = objtype->path_func; type_data.blob_func = objtype->blob_func; + type_data.uri_func = objtype->uri_func; if (info->handler) { if (info->handler (info->connection, @@ -540,7 +551,7 @@ cert_writer (KeyfileWriterInfo *info, cert_writer_default (info->connection, info->keyfile, &type_data); } -/**************************************************************************/ +/*****************************************************************************/ typedef struct { const char *setting_name; @@ -627,9 +638,6 @@ can_omit_default_value (NMSetting *setting, const char *property) } else if (NM_IS_SETTING_IP6_CONFIG (setting)) { if (!strcmp (property, NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE)) return FALSE; - } else if (NM_IS_SETTING_WIRELESS (setting)) { - if (!strcmp (property, NM_SETTING_WIRELESS_MAC_ADDRESS_RANDOMIZATION)) - return FALSE; } return TRUE; @@ -729,17 +737,8 @@ write_setting_value (NMSetting *setting, bytes = g_value_get_boxed (value); data = bytes ? g_bytes_get_data (bytes, &len) : NULL; - if (data != NULL && len > 0) { - int *tmp_array; - int i; - - tmp_array = g_new (gint, len); - for (i = 0; i < len; i++) - tmp_array[i] = (int) data[i]; - - nm_keyfile_plugin_kf_set_integer_list (info->keyfile, setting_name, key, tmp_array, len); - g_free (tmp_array); - } + if (data != NULL && len > 0) + nm_keyfile_plugin_kf_set_integer_list_uint8 (info->keyfile, setting_name, key, data, len); } else if (type == G_TYPE_STRV) { char **array; |