From: Yu Watanabe Date: Sat, 2 Mar 2019 15:35:58 +0000 (+0900) Subject: core: fix received size of signal or status size X-Git-Tag: v242-rc1~203^2~10 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=a672f4fe8d41c7ab94a5b6b4056be39eb2ceb068;p=thirdparty%2Fsystemd.git core: fix received size of signal or status size sd_bus_message_read_array() returns size of array in bytes, not number of elements. This also convert int to int32_t, as the dbus type 'i' is int32_t. --- diff --git a/src/core/dbus-service.c b/src/core/dbus-service.c index 0904cc09c02..0eb336cf03d 100644 --- a/src/core/dbus-service.c +++ b/src/core/dbus-service.c @@ -55,7 +55,7 @@ static int property_get_exit_status_set( return r; SET_FOREACH(id, status_set->status, i) { - int val = PTR_TO_INT(id); + int32_t val = PTR_TO_INT(id); if (val < 0 || val > 255) continue; @@ -74,10 +74,10 @@ static int property_get_exit_status_set( return r; SET_FOREACH(id, status_set->signal, i) { - int val = PTR_TO_INT(id); + int32_t val = PTR_TO_INT(id); const char *str; - str = signal_to_string(val); + str = signal_to_string((int) val); if (!str) continue; @@ -151,7 +151,7 @@ static int bus_set_transient_exit_status( UnitWriteFlags flags, sd_bus_error *error) { - const int *status, *signal; + const int32_t *status, *signal; size_t sz_status, sz_signal, i; int r; @@ -171,6 +171,9 @@ static int bus_set_transient_exit_status( if (r < 0) return r; + sz_status /= sizeof(int32_t); + sz_signal /= sizeof(int32_t); + if (sz_status == 0 && sz_signal == 0 && !UNIT_WRITE_FLAGS_NOOP(flags)) { exit_status_set_free(status_set); unit_write_settingf(u, flags, name, "%s=", name); @@ -179,34 +182,34 @@ static int bus_set_transient_exit_status( for (i = 0; i < sz_status; i++) { if (status[i] < 0 || status[i] > 255) - return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid status code in %s: %i", name, status[i]); + return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid status code in %s: %"PRIi32, name, status[i]); if (!UNIT_WRITE_FLAGS_NOOP(flags)) { r = set_ensure_allocated(&status_set->status, NULL); if (r < 0) return r; - r = set_put(status_set->status, INT_TO_PTR(status[i])); + r = set_put(status_set->status, INT_TO_PTR((int) status[i])); if (r < 0) return r; - unit_write_settingf(u, flags, name, "%s=%i", name, status[i]); + unit_write_settingf(u, flags, name, "%s=%"PRIi32, name, status[i]); } } for (i = 0; i < sz_signal; i++) { const char *str; - str = signal_to_string(signal[i]); + str = signal_to_string((int) signal[i]); if (!str) - return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid signal in %s: %i", name, signal[i]); + return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid signal in %s: %"PRIi32, name, signal[i]); if (!UNIT_WRITE_FLAGS_NOOP(flags)) { r = set_ensure_allocated(&status_set->signal, NULL); if (r < 0) return r; - r = set_put(status_set->signal, INT_TO_PTR(signal[i])); + r = set_put(status_set->signal, INT_TO_PTR((int) signal[i])); if (r < 0) return r;