summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2019-05-30 08:29:19 +0200
committerThomas Haller <thaller@redhat.com>2019-06-09 22:01:19 +0200
commit1da582d6040eb2f6a5b3a291bd9920034201222f (patch)
treeab440755f9f4bbda7172dcbdd19ba880c34092b0
parenta22494022a76bcb5c2fdf2ba3fb20054f85188f8 (diff)
downloadNetworkManager-th/platform-link-broadcast.tar.gz
platform: avoid heap allocating string buffer for printing link flagsth/platform-link-broadcast
-rw-r--r--src/platform/nm-platform.c32
-rw-r--r--src/platform/nm-platform.h2
-rw-r--r--src/platform/tests/test-platform-general.c27
3 files changed, 46 insertions, 15 deletions
diff --git a/src/platform/nm-platform.c b/src/platform/nm-platform.c
index a4a0eb8d98..0c3888a4d6 100644
--- a/src/platform/nm-platform.c
+++ b/src/platform/nm-platform.c
@@ -5390,7 +5390,10 @@ nm_platform_link_to_string (const NMPlatformLink *link, char *buf, gsize len)
{
char master[20];
char parent[20];
- GString *str_flags;
+ char str_flags[1 + NM_PLATFORM_LINK_FLAGS2STR_MAX_LEN + 1];
+ char str_highlighted_flags[50];
+ char *s;
+ gsize l;
char str_addrmode[30];
char str_address[NM_UTILS_HWADDR_LEN_MAX * 3];
char str_broadcast[NM_UTILS_HWADDR_LEN_MAX * 3];
@@ -5400,22 +5403,23 @@ nm_platform_link_to_string (const NMPlatformLink *link, char *buf, gsize len)
if (!nm_utils_to_string_buffer_init_null (link, &buf, &len))
return buf;
- str_flags = g_string_new (NULL);
+ s = str_highlighted_flags;
+ l = sizeof (str_highlighted_flags);
if (NM_FLAGS_HAS (link->n_ifi_flags, IFF_NOARP))
- g_string_append (str_flags, "NOARP,");
+ nm_utils_strbuf_append_str (&s, &l, "NOARP,");
if (NM_FLAGS_HAS (link->n_ifi_flags, IFF_UP))
- g_string_append (str_flags, "UP");
+ nm_utils_strbuf_append_str (&s, &l, "UP");
else
- g_string_append (str_flags, "DOWN");
+ nm_utils_strbuf_append_str (&s, &l, "DOWN");
if (link->connected)
- g_string_append (str_flags, ",LOWER_UP");
+ nm_utils_strbuf_append_str (&s, &l, ",LOWER_UP");
+ nm_assert (s > str_highlighted_flags && l > 0);
if (link->n_ifi_flags) {
- char str_flags_buf[64];
-
- nm_platform_link_flags2str (link->n_ifi_flags, str_flags_buf, sizeof (str_flags_buf));
- g_string_append_printf (str_flags, ";%s", str_flags_buf);
- }
+ str_flags[0] = ';';
+ nm_platform_link_flags2str (link->n_ifi_flags, &str_flags[1], sizeof (str_flags) - 1);
+ } else
+ str_flags[0] = '\0';
if (link->master)
g_snprintf (master, sizeof (master), " master %d", link->master);
@@ -5438,7 +5442,7 @@ nm_platform_link_to_string (const NMPlatformLink *link, char *buf, gsize len)
"%d: " /* ifindex */
"%s" /* name */
"%s" /* parent */
- " <%s>" /* flags */
+ " <%s%s>" /* flags */
" mtu %d"
"%s" /* master */
" arp %u" /* arptype */
@@ -5456,7 +5460,8 @@ nm_platform_link_to_string (const NMPlatformLink *link, char *buf, gsize len)
link->ifindex,
link->name,
parent,
- str_flags->str,
+ str_highlighted_flags,
+ str_flags,
link->mtu, master,
link->arptype,
str_link_type ?: "???",
@@ -5475,7 +5480,6 @@ nm_platform_link_to_string (const NMPlatformLink *link, char *buf, gsize len)
link->driver ?: "",
link->rx_packets, link->rx_bytes,
link->tx_packets, link->tx_bytes);
- g_string_free (str_flags, TRUE);
return buf;
}
diff --git a/src/platform/nm-platform.h b/src/platform/nm-platform.h
index 972b009361..70e956206c 100644
--- a/src/platform/nm-platform.h
+++ b/src/platform/nm-platform.h
@@ -1791,6 +1791,8 @@ void nm_platform_lnk_wireguard_hash_update (const NMPlatformLnkWireGuard *obj, N
void nm_platform_qdisc_hash_update (const NMPlatformQdisc *obj, NMHashState *h);
void nm_platform_tfilter_hash_update (const NMPlatformTfilter *obj, NMHashState *h);
+#define NM_PLATFORM_LINK_FLAGS2STR_MAX_LEN ((gsize) 162)
+
const char *nm_platform_link_flags2str (unsigned flags, char *buf, gsize len);
const char *nm_platform_link_inet6_addrgenmode2str (guint8 mode, char *buf, gsize len);
const char *nm_platform_addr_flags2str (unsigned flags, char *buf, gsize len);
diff --git a/src/platform/tests/test-platform-general.c b/src/platform/tests/test-platform-general.c
index eebc15d80d..7f98b65f99 100644
--- a/src/platform/tests/test-platform-general.c
+++ b/src/platform/tests/test-platform-general.c
@@ -52,6 +52,31 @@ test_link_get_all (void)
/*****************************************************************************/
+static void
+test_nm_platform_link_flags2str (void)
+{
+ int i;
+
+ for (i = 0; i < 100; i++) {
+ char buf[NM_PLATFORM_LINK_FLAGS2STR_MAX_LEN + 100];
+ const char *s;
+ const guint flags = ((i == 0) ? ~0u : nmtst_get_rand_uint ());
+ gsize l;
+
+ s = nm_platform_link_flags2str (flags, buf, sizeof (buf));
+ g_assert (s);
+
+ l = strlen (s);
+ if (l > NM_PLATFORM_LINK_FLAGS2STR_MAX_LEN)
+ g_error ("nm_platform_link_flags2str(%x) produced a longer output than %zu chars: \"%s\"", flags, NM_PLATFORM_LINK_FLAGS2STR_MAX_LEN, s);
+ if ( flags == ~0u
+ && l != NM_PLATFORM_LINK_FLAGS2STR_MAX_LEN)
+ g_error ("nm_platform_link_flags2str(%x) is expected to produce %zu chars, but produced %zu: \"%s\"", flags, NM_PLATFORM_LINK_FLAGS2STR_MAX_LEN, l, s);
+ }
+}
+
+/*****************************************************************************/
+
NMTST_DEFINE ();
int
@@ -61,7 +86,7 @@ main (int argc, char **argv)
g_test_add_func ("/general/init_linux_platform", test_init_linux_platform);
g_test_add_func ("/general/link_get_all", test_link_get_all);
+ g_test_add_func ("/general/nm_platform_link_flags2str", test_nm_platform_link_flags2str);
return g_test_run ();
}
-