From 2ce397125fe77220d881e0c57bf0c1e7803f9cf7 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Thu, 4 Sep 2025 18:38:38 +0900 Subject: [PATCH] core/varlink: do not call io.systemd.oom.ReportManagedOOMCGroups() with empty "cgroups" parameter Fixes the following varlink IDL validation error: ``` systemd-oomd[1687]: varlink-11-11: Parameters for method io.systemd.oom.ReportManagedOOMCGroups() didn't pass validation on field 'cgroups': No anode ``` --- src/core/varlink.c | 43 +++++++++++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/src/core/varlink.c b/src/core/varlink.c index 22312a11f76..17f5ac4fad9 100644 --- a/src/core/varlink.c +++ b/src/core/varlink.c @@ -69,16 +69,18 @@ static int build_managed_oom_json_array_element(Unit *u, const char *property, s SD_JSON_BUILD_PAIR_CONDITION(use_duration, "duration", SD_JSON_BUILD_UNSIGNED(c->moom_mem_pressure_duration_usec))); } -static int build_managed_oom_cgroups_json(Manager *m, sd_json_variant **ret) { - _cleanup_(sd_json_variant_unrefp) sd_json_variant *v = NULL, *arr = NULL; +static int build_managed_oom_cgroups_json(Manager *m, bool allow_empty, sd_json_variant **ret) { + _cleanup_(sd_json_variant_unrefp) sd_json_variant *arr = NULL; int r; assert(m); assert(ret); - r = sd_json_build(&arr, SD_JSON_BUILD_EMPTY_ARRAY); - if (r < 0) - return r; + if (allow_empty) { + r = sd_json_build(&arr, SD_JSON_BUILD_EMPTY_ARRAY); + if (r < 0) + return r; + } for (UnitType t = 0; t < _UNIT_TYPE_MAX; t++) { @@ -119,12 +121,17 @@ static int build_managed_oom_cgroups_json(Manager *m, sd_json_variant **ret) { } } - r = sd_json_buildo(&v, SD_JSON_BUILD_PAIR("cgroups", SD_JSON_BUILD_VARIANT(arr))); + if (!arr) { + assert(!allow_empty); + *ret = NULL; + return 0; + } + + r = sd_json_buildo(ret, SD_JSON_BUILD_PAIR("cgroups", SD_JSON_BUILD_VARIANT(arr))); if (r < 0) return r; - *ret = TAKE_PTR(v); - return 0; + return 1; } static int manager_varlink_send_managed_oom_initial(Manager *m) { @@ -141,8 +148,8 @@ static int manager_varlink_send_managed_oom_initial(Manager *m) { assert(m->managed_oom_varlink); - r = build_managed_oom_cgroups_json(m, &v); - if (r < 0) + r = build_managed_oom_cgroups_json(m, /* allow_empty = */ false, &v); + if (r <= 0) return r; return sd_varlink_send(m->managed_oom_varlink, "io.systemd.oom.ReportManagedOOMCGroups", v); @@ -251,9 +258,11 @@ int manager_varlink_send_managed_oom_update(Unit *u) { if (!c) return 0; - r = sd_json_build(&arr, SD_JSON_BUILD_EMPTY_ARRAY); - if (r < 0) - return r; + if (MANAGER_IS_SYSTEM(u->manager)) { + r = sd_json_build(&arr, SD_JSON_BUILD_EMPTY_ARRAY); + if (r < 0) + return r; + } FOREACH_ELEMENT(i, managed_oom_mode_properties) { _cleanup_(sd_json_variant_unrefp) sd_json_variant *e = NULL; @@ -267,6 +276,12 @@ int manager_varlink_send_managed_oom_update(Unit *u) { return r; } + if (!arr) { + /* There is nothing updated. Skip calling method. */ + assert(!MANAGER_IS_SYSTEM(u->manager)); + return 0; + } + r = sd_json_buildo(&v, SD_JSON_BUILD_PAIR("cgroups", SD_JSON_BUILD_VARIANT(arr))); if (r < 0) return r; @@ -320,7 +335,7 @@ static int vl_method_subscribe_managed_oom_cgroups( _cleanup_(sd_json_variant_unrefp) sd_json_variant *v = NULL; - r = build_managed_oom_cgroups_json(m, &v); + r = build_managed_oom_cgroups_json(m, /* allow_empty = */ true, &v); if (r < 0) return r; -- 2.47.3