summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2023-03-18 12:12:01 +0900
committerYu Watanabe <watanabe.yu+github@gmail.com>2023-03-18 12:12:05 +0900
commit366eced4c81a15a25b9225347fa203aa67798b02 (patch)
tree6b7d4637e8050180e27f4894f89c3000a9d67525 /src
parent6c2caf50534a7f7c9e813f6855f7f446dafac584 (diff)
downloadsystemd-366eced4c81a15a25b9225347fa203aa67798b02.tar.gz
core/transaction: make merge_unit_ids() always return NUL-terminated string
Follow-up for 924775e8ce49817f96df19c2b06356c12ecfc754. The loop run with `STRV_FOREACH_PAIR()`, hence `if (*(unit_id+1))` is not a good way to detect if there exist a next entry. Fixes #26872.
Diffstat (limited to 'src')
-rw-r--r--src/core/transaction.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/src/core/transaction.c b/src/core/transaction.c
index a6fd184e33..1f420fe176 100644
--- a/src/core/transaction.c
+++ b/src/core/transaction.c
@@ -323,22 +323,25 @@ _pure_ static bool unit_matters_to_anchor(Unit *u, Job *job) {
return false;
}
-static char* merge_unit_ids(const char* unit_log_field, char **pairs) {
- char *ans = NULL;
- size_t size = 0, next;
+static char* merge_unit_ids(const char* unit_log_field, char * const* pairs) {
+ _cleanup_free_ char *ans = NULL;
+ size_t size = 0;
STRV_FOREACH_PAIR(unit_id, job_type, pairs) {
+ size_t next;
+
+ if (size > 0)
+ ans[size - 1] = '\n';
+
next = strlen(unit_log_field) + strlen(*unit_id);
if (!GREEDY_REALLOC(ans, size + next + 1))
- return mfree(ans);
+ return NULL;
sprintf(ans + size, "%s%s", unit_log_field, *unit_id);
- if (*(unit_id+1))
- ans[size + next] = '\n';
size += next + 1;
}
- return ans;
+ return TAKE_PTR(ans);
}
static int transaction_verify_order_one(Transaction *tr, Job *j, Job *from, unsigned generation, sd_bus_error *e) {