From ad5555b42e9f6c01314df9e11432f0bf90cd909d Mon Sep 17 00:00:00 2001 From: Alin Popa Date: Fri, 14 Feb 2020 09:33:43 +0100 Subject: systemd: Fix busctl crash on aarch64 when setting output table format The enum used for column names is integer type while table_set_display() is parsing arguments on size_t alignment which may result in assert in table_set_display() if the size between types missmatch. This patch cast the enums to size_t. It also fixes all other occurences for table_set_display() and table_set_sort(). --- src/analyze/analyze-security.c | 4 ++-- src/analyze/analyze.c | 2 +- src/busctl/busctl.c | 2 +- src/mount/mount-tool.c | 2 +- src/network/networkctl.c | 2 +- src/partition/repart.c | 2 +- src/systemctl/systemctl.c | 2 +- src/userdb/userdbctl.c | 12 ++++++------ 8 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/analyze/analyze-security.c b/src/analyze/analyze-security.c index ee782e5689..d681251c04 100644 --- a/src/analyze/analyze-security.c +++ b/src/analyze/analyze-security.c @@ -1458,11 +1458,11 @@ static int assess(const struct security_info *info, Table *overview_table, Analy if (!details_table) return log_oom(); - (void) table_set_sort(details_table, 3, 1, (size_t) -1); + (void) table_set_sort(details_table, (size_t) 3, (size_t) 1, (size_t) -1); (void) table_set_reverse(details_table, 3, true); if (getenv_bool("SYSTEMD_ANALYZE_DEBUG") <= 0) - (void) table_set_display(details_table, 0, 1, 2, 6, (size_t) -1); + (void) table_set_display(details_table, (size_t) 0, (size_t) 1, (size_t) 2, (size_t) 6, (size_t) -1); } for (i = 0; i < ELEMENTSOF(security_assessor_table); i++) { diff --git a/src/analyze/analyze.c b/src/analyze/analyze.c index 50f4573eb8..217e7e1a96 100644 --- a/src/analyze/analyze.c +++ b/src/analyze/analyze.c @@ -1101,7 +1101,7 @@ static int analyze_blame(int argc, char *argv[], void *userdata) { if (r < 0) return r; - r = table_set_sort(table, 0, SIZE_MAX); + r = table_set_sort(table, (size_t) 0, (size_t) SIZE_MAX); if (r < 0) return r; diff --git a/src/busctl/busctl.c b/src/busctl/busctl.c index b4e133ff95..3c75be381f 100644 --- a/src/busctl/busctl.c +++ b/src/busctl/busctl.c @@ -207,7 +207,7 @@ static int list_bus_names(int argc, char **argv, void *userdata) { if (r < 0) return log_error_errno(r, "Failed to set empty string: %m"); - r = table_set_sort(table, COLUMN_NAME, (size_t) -1); + r = table_set_sort(table, (size_t) COLUMN_NAME, (size_t) -1); if (r < 0) return log_error_errno(r, "Failed to set sort column: %m"); diff --git a/src/mount/mount-tool.c b/src/mount/mount-tool.c index 77d9cbb452..982e0a285e 100644 --- a/src/mount/mount-tool.c +++ b/src/mount/mount-tool.c @@ -1403,7 +1403,7 @@ static int list_devices(void) { if (arg_full) table_set_width(table, 0); - r = table_set_sort(table, 0, SIZE_MAX); + r = table_set_sort(table, (size_t) 0, (size_t) SIZE_MAX); if (r < 0) return log_error_errno(r, "Failed to set sort index: %m"); diff --git a/src/network/networkctl.c b/src/network/networkctl.c index a470488664..078cf1f0cf 100644 --- a/src/network/networkctl.c +++ b/src/network/networkctl.c @@ -879,7 +879,7 @@ static int dump_address_labels(sd_netlink *rtnl) { if (arg_full) table_set_width(table, 0); - r = table_set_sort(table, 0, SIZE_MAX); + r = table_set_sort(table, (size_t) 0, (size_t) SIZE_MAX); if (r < 0) return r; diff --git a/src/partition/repart.c b/src/partition/repart.c index 0e5dadaf60..3e52f26a1d 100644 --- a/src/partition/repart.c +++ b/src/partition/repart.c @@ -1555,7 +1555,7 @@ static int context_dump_partitions(Context *context, const char *node) { return log_oom(); if (!DEBUG_LOGGING) - (void) table_set_display(t, 0, 1, 2, 3, 4, 7, 9, (size_t) -1); + (void) table_set_display(t, (size_t) 0, (size_t) 1, (size_t) 2, (size_t) 3, (size_t) 4, (size_t) 7, (size_t) 9, (size_t) -1); (void) table_set_align_percent(t, table_get_cell(t, 0, 4), 100); (void) table_set_align_percent(t, table_get_cell(t, 0, 5), 100); diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c index 37febfa104..771ede7397 100644 --- a/src/systemctl/systemctl.c +++ b/src/systemctl/systemctl.c @@ -991,7 +991,7 @@ static int output_sockets_list(struct socket_info *socket_infos, unsigned cs) { if (!arg_show_types) { /* Hide the second (TYPE) column */ - r = table_set_display(table, 0, 2, 3, (size_t) -1); + r = table_set_display(table, (size_t) 0, (size_t) 2, (size_t) 3, (size_t) -1); if (r < 0) return log_error_errno(r, "Failed to set columns to display: %m"); } diff --git a/src/userdb/userdbctl.c b/src/userdb/userdbctl.c index 9083797856..f085eb232c 100644 --- a/src/userdb/userdbctl.c +++ b/src/userdb/userdbctl.c @@ -112,8 +112,8 @@ static int display_user(int argc, char *argv[], void *userdata) { (void) table_set_align_percent(table, table_get_cell(table, 0, 2), 100); (void) table_set_align_percent(table, table_get_cell(table, 0, 3), 100); (void) table_set_empty_string(table, "-"); - (void) table_set_sort(table, 7, 2, (size_t) -1); - (void) table_set_display(table, 0, 1, 2, 3, 4, 5, 6, (size_t) -1); + (void) table_set_sort(table, (size_t) 7, (size_t) 2, (size_t) -1); + (void) table_set_display(table, (size_t) 0, (size_t) 1, (size_t) 2, (size_t) 3, (size_t) 4, (size_t) 5, (size_t) 6, (size_t) -1); } if (argc > 1) { @@ -260,8 +260,8 @@ static int display_group(int argc, char *argv[], void *userdata) { return log_oom(); (void) table_set_align_percent(table, table_get_cell(table, 0, 2), 100); - (void) table_set_sort(table, 3, 2, (size_t) -1); - (void) table_set_display(table, 0, 1, 2, (size_t) -1); + (void) table_set_sort(table, (size_t) 3, (size_t) 2, (size_t) -1); + (void) table_set_display(table, (size_t) 0, (size_t) 1, (size_t) 2, (size_t) -1); } if (argc > 1) { @@ -400,7 +400,7 @@ static int display_memberships(int argc, char *argv[], void *userdata) { if (!table) return log_oom(); - (void) table_set_sort(table, 0, 1, (size_t) -1); + (void) table_set_sort(table, (size_t) 0, (size_t) 1, (size_t) -1); } if (argc > 1) { @@ -489,7 +489,7 @@ static int display_services(int argc, char *argv[], void *userdata) { if (!t) return log_oom(); - (void) table_set_sort(t, 0, (size_t) -1); + (void) table_set_sort(t, (size_t) 0, (size_t) -1); FOREACH_DIRENT(de, d, return -errno) { _cleanup_free_ char *j = NULL, *no = NULL; -- cgit v1.2.1