X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fsd-login.c;h=a0a56c49526ebdf2fb85a83137418b2e8c77d679;hb=2096e009a790073a934f5cd07d17024d3b199d0b;hp=2489d78c603dba842113eda63d8ee663eb0100ce;hpb=d60ef5265063914ca1502e56f77fd7d70e975da3;p=elogind.git diff --git a/src/sd-login.c b/src/sd-login.c index 2489d78c6..a0a56c495 100644 --- a/src/sd-login.c +++ b/src/sd-login.c @@ -481,33 +481,39 @@ _public_ int sd_seat_get_sessions(const char *seat, char ***sessions, uid_t **ui if (uids && t) { char *w, *state; size_t l; - unsigned i = 0; FOREACH_WORD(w, l, t, state) n++; - b = new(uid_t, n); - if (!b) { - strv_free(a); - return -ENOMEM; - } - - FOREACH_WORD(w, l, t, state) { - char *k; + if (n == 0) + b = NULL; + else { + unsigned i = 0; - k = strndup(w, l); - if (!k) { - free(t); - free(b); + b = new(uid_t, n); + if (!b) { + strv_free(a); return -ENOMEM; } - r = parse_uid(k, b + i); - free(k); - if (r < 0) - continue; + FOREACH_WORD(w, l, t, state) { + char *k; + + k = strndup(w, l); + if (!k) { + free(t); + free(b); + strv_free(a); + return -ENOMEM; + } - i++; + r = parse_uid(k, b + i); + free(k); + if (r < 0) + continue; + + i++; + } } } @@ -574,6 +580,9 @@ _public_ int sd_get_uids(uid_t **users) { uid_t *l = NULL; d = opendir("/run/systemd/users/"); + if (!d) + return -errno; + for (;;) { struct dirent buffer, *de; int k;