summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2020-06-29 09:52:32 +0200
committerThomas Haller <thaller@redhat.com>2020-07-03 10:34:27 +0200
commit4f542384c3357f913c7c9b2642cf54065addf181 (patch)
treeb1bd54af6815de58f719ca7bc46bd927126ecaea
parente2bd72235863504e899c173b510739ac24ff19a0 (diff)
downloadNetworkManager-4f542384c3357f913c7c9b2642cf54065addf181.tar.gz
cloud-setup: use nm_utils_parse_next_line() in _get_config_metadata_ready_check()
nm_utils_parse_next_line() has more flexible handling of line endings (for example, also accpting "\0", "\r", "\r\n"). Use it.
-rw-r--r--clients/cloud-setup/nmcs-provider-ec2.c43
1 files changed, 14 insertions, 29 deletions
diff --git a/clients/cloud-setup/nmcs-provider-ec2.c b/clients/cloud-setup/nmcs-provider-ec2.c
index a3b4c9a0d3..1427534b68 100644
--- a/clients/cloud-setup/nmcs-provider-ec2.c
+++ b/clients/cloud-setup/nmcs-provider-ec2.c
@@ -436,7 +436,9 @@ _get_config_metadata_ready_check (long response_code,
GetConfigMetadataData *metadata_data = check_user_data;
gs_unref_hashtable GHashTable *response_parsed = NULL;
const guint8 *r_data;
+ const char *cur_line;
gsize r_len;
+ gsize cur_line_len;
GHashTableIter h_iter;
gboolean has_all;
const char *c_hwaddr;
@@ -452,47 +454,30 @@ _get_config_metadata_ready_check (long response_code,
/* NMHttpClient guarantees that there is a trailing NUL after the data. */
nm_assert (r_data[r_len] == 0);
- while (r_len > 0) {
- const guint8 *p_eol;
- const char *p_start;
- gsize p_start_l;
- gsize p_start_l_2;
- char *hwaddr;
+ while (nm_utils_parse_next_line ((const char **) &r_data, &r_len, &cur_line, &cur_line_len)) {
GetConfigMetadataMac *mac_data;
+ char *hwaddr;
- p_start = (const char *) r_data;
-
- p_eol = memchr (r_data, '\n', r_len);
- if (p_eol) {
- p_start_l = (p_eol - r_data);
- r_len -= p_start_l + 1;
- r_data = &p_eol[1];
- } else {
- p_start_l = r_len;
- r_data = &r_data[r_len];
- r_len = 0;
- }
-
- if (p_start_l == 0)
+ if (cur_line_len == 0)
continue;
- p_start_l_2 = p_start_l;
- if (p_start[p_start_l_2 - 1] == '/') {
- /* trim the trailing "/". */
- p_start_l_2--;
- }
+ /* Truncate the string. It's safe to do, because we own @response_data an it has an
+ * extra NUL character after the buffer. */
+ ((char *) cur_line)[cur_line_len] = '\0';
- hwaddr = nmcs_utils_hwaddr_normalize (p_start, p_start_l_2);
+ hwaddr = nmcs_utils_hwaddr_normalize (cur_line,
+ cur_line[cur_line_len - 1u] == '/'
+ ? (gssize) (cur_line_len - 1u)
+ : -1);
if (!hwaddr)
continue;
if (!response_parsed)
response_parsed = g_hash_table_new_full (nm_str_hash, g_str_equal, g_free, g_free);
- mac_data = g_malloc (sizeof (GetConfigMetadataMac) + 1 + p_start_l);
+ mac_data = g_malloc (sizeof (GetConfigMetadataMac) + 1u + cur_line_len);
mac_data->iface_idx = iface_idx_counter++;
- memcpy (mac_data->path, p_start, p_start_l);
- mac_data->path[p_start_l] = '\0';
+ memcpy (mac_data->path, cur_line, cur_line_len + 1u);
g_hash_table_insert (response_parsed, hwaddr, mac_data);
}