summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2020-06-14 12:12:43 +0200
committerThomas Haller <thaller@redhat.com>2020-06-15 15:02:53 +0200
commit4043f8279003a3d4a8406e4b039069c01f9b3138 (patch)
tree6d8a51f8cf3219e2dcd6b696af1383b68e24bd54
parent6e02622f57b656d73d49eceb3898e38c2c68a1e6 (diff)
downloadNetworkManager-4043f8279003a3d4a8406e4b039069c01f9b3138.tar.gz
lldp: cleanup converting binary LLDP fields to string
Introduce and use format_string() helper to convert the binary fields to string. This is like systemd's parse_string() function.
-rw-r--r--src/devices/nm-lldp-listener.c51
1 files changed, 46 insertions, 5 deletions
diff --git a/src/devices/nm-lldp-listener.c b/src/devices/nm-lldp-listener.c
index e642305cea..8e915b4aed 100644
--- a/src/devices/nm-lldp-listener.c
+++ b/src/devices/nm-lldp-listener.c
@@ -353,6 +353,45 @@ format_network_address (const guint8 *data, gsize sz)
return nm_utils_inet_ntop_dup (family, &a);
}
+static const char *
+format_string (const guint8 *data, gsize len, gboolean allow_trim, char **out_to_free)
+{
+ gboolean is_null_terminated = FALSE;
+
+ nm_assert (out_to_free && !*out_to_free);
+
+ if (allow_trim) {
+ while ( len > 0
+ && data[len - 1] == '\0') {
+ is_null_terminated = TRUE;
+ len--;
+ }
+ }
+
+ if (len == 0)
+ return NULL;
+
+ if (memchr (data, len, '\0'))
+ return NULL;
+
+ return nm_utils_buf_utf8safe_escape (data,
+ is_null_terminated ? -1 : (gssize) len,
+ NM_UTILS_STR_UTF8_SAFE_FLAG_ESCAPE_CTRL
+ | NM_UTILS_STR_UTF8_SAFE_FLAG_ESCAPE_NON_ASCII,
+ out_to_free);
+}
+
+static char *
+format_string_cp (const guint8 *data, gsize len, gboolean allow_trim)
+{
+ char *s_free = NULL;
+ const char *s;
+
+ s = format_string (data, len, allow_trim, &s_free);
+ nm_assert (!s_free || s == s_free);
+ return s ? (s_free ?: g_strdup (s)) : NULL;
+}
+
static LldpNeighbor *
lldp_neighbor_new (sd_lldp_neighbor *neighbor_sd)
{
@@ -381,7 +420,7 @@ lldp_neighbor_new (sd_lldp_neighbor *neighbor_sd)
case SD_LLDP_CHASSIS_SUBTYPE_PORT_COMPONENT:
case SD_LLDP_CHASSIS_SUBTYPE_INTERFACE_NAME:
case SD_LLDP_CHASSIS_SUBTYPE_LOCALLY_ASSIGNED:
- s_chassis_id = nm_utils_buf_utf8safe_escape_cp (chassis_id, chassis_id_len, NM_UTILS_STR_UTF8_SAFE_FLAG_ESCAPE_CTRL | NM_UTILS_STR_UTF8_SAFE_FLAG_ESCAPE_NON_ASCII);
+ s_chassis_id = format_string_cp (chassis_id, chassis_id_len, FALSE);
break;
case SD_LLDP_CHASSIS_SUBTYPE_MAC_ADDRESS:
s_chassis_id = nm_utils_hwaddr_ntoa (chassis_id, chassis_id_len);
@@ -402,7 +441,7 @@ lldp_neighbor_new (sd_lldp_neighbor *neighbor_sd)
case SD_LLDP_PORT_SUBTYPE_PORT_COMPONENT:
case SD_LLDP_PORT_SUBTYPE_INTERFACE_NAME:
case SD_LLDP_PORT_SUBTYPE_LOCALLY_ASSIGNED:
- s_port_id = nm_utils_buf_utf8safe_escape_cp (port_id, port_id_len, NM_UTILS_STR_UTF8_SAFE_FLAG_ESCAPE_CTRL | NM_UTILS_STR_UTF8_SAFE_FLAG_ESCAPE_NON_ASCII);
+ s_port_id = format_string_cp (port_id, port_id_len, FALSE);
break;
case SD_LLDP_PORT_SUBTYPE_MAC_ADDRESS:
s_port_id = nm_utils_hwaddr_ntoa (port_id, port_id_len);
@@ -588,7 +627,7 @@ lldp_neighbor_to_variant (LldpNeighbor *neigh)
gs_free char *name_to_free = NULL;
const char *name;
guint32 vid;
- int l;
+ gsize l;
if (len <= 3)
continue;
@@ -599,9 +638,11 @@ lldp_neighbor_to_variant (LldpNeighbor *neigh)
if (l > 32)
continue;
- name = nm_utils_buf_utf8safe_escape (&data8[3], l, 0, &name_to_free);
- vid = unaligned_read_be16 (&data8[0]);
+ name = format_string (&data8[3], l, TRUE, &name_to_free);
+ if (!name)
+ continue;
+ vid = unaligned_read_be16 (&data8[0]);
if (!v_ieee_802_1_vid) {
v_ieee_802_1_vid = g_variant_new_uint32 (vid);
v_ieee_802_1_vlan_name = g_variant_new_string (name);