diff options
author | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2020-07-30 12:56:51 +0200 |
---|---|---|
committer | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2020-09-09 09:34:54 +0200 |
commit | 0ef14adc1c724eee8d5f4db3d298786b209afaa5 (patch) | |
tree | b3ea62774a5ae0ee69b285f8def952197427178f /src/libsystemd/sd-login | |
parent | aa3b40c3f98f28312967b3f9ba1f353efd9c9873 (diff) | |
download | systemd-0ef14adc1c724eee8d5f4db3d298786b209afaa5.tar.gz |
Rewrite sd_machine_get_ifindices() to avoid FOREACH_WORD()
If we fail to parse the index, the failure is propogated as -EUNCLEAN.
(-EINVAL would be confused with invalid args to the function itself.)
Diffstat (limited to 'src/libsystemd/sd-login')
-rw-r--r-- | src/libsystemd/sd-login/sd-login.c | 46 |
1 files changed, 23 insertions, 23 deletions
diff --git a/src/libsystemd/sd-login/sd-login.c b/src/libsystemd/sd-login/sd-login.c index 14e0468720..3828fa58e4 100644 --- a/src/libsystemd/sd-login/sd-login.c +++ b/src/libsystemd/sd-login/sd-login.c @@ -894,47 +894,47 @@ _public_ int sd_machine_get_class(const char *machine, char **class) { return 0; } -_public_ int sd_machine_get_ifindices(const char *machine, int **ifindices) { - _cleanup_free_ char *netif = NULL; - size_t l, allocated = 0, nr = 0; - int *ni = NULL; - const char *p, *word, *state; +_public_ int sd_machine_get_ifindices(const char *machine, int **ret_ifindices) { + _cleanup_free_ char *netif_line = NULL; + const char *p; int r; assert_return(machine_name_is_valid(machine), -EINVAL); - assert_return(ifindices, -EINVAL); + assert_return(ret_ifindices, -EINVAL); p = strjoina("/run/systemd/machines/", machine); - r = parse_env_file(NULL, p, "NETIF", &netif); + r = parse_env_file(NULL, p, "NETIF", &netif_line); if (r == -ENOENT) return -ENXIO; if (r < 0) return r; - if (!netif) { - *ifindices = NULL; + if (!netif_line) { + *ret_ifindices = NULL; return 0; } - FOREACH_WORD(word, l, netif, state) { - char buf[l+1]; - int ifi; + _cleanup_strv_free_ char **tt = strv_split(netif_line, NULL); + if (!tt) + return -ENOMEM; - *(char*) (mempcpy(buf, word, l)) = 0; + size_t n = 0; + int *ifindices = new(int, strv_length(tt)); + if (!ifindices) + return -ENOMEM; - ifi = parse_ifindex(buf); - if (ifi < 0) - continue; + for (size_t i = 0; tt[i]; i++) { + int ind; - if (!GREEDY_REALLOC(ni, allocated, nr+1)) { - free(ni); - return -ENOMEM; - } + ind = parse_ifindex(tt[i]); + if (ind < 0) + /* Return -EUCLEAN to distinguish from -EINVAL for invalid args */ + return ind == -EINVAL ? -EUCLEAN : ind; - ni[nr++] = ifi; + ifindices[n++] = ind; } - *ifindices = ni; - return nr; + *ret_ifindices = ifindices; + return n; } static int MONITOR_TO_FD(sd_login_monitor *m) { |