From: Zbigniew Jędrzejewski-Szmek Date: Thu, 30 Jul 2020 10:56:51 +0000 (+0200) Subject: Rewrite sd_machine_get_ifindices() to avoid FOREACH_WORD() X-Git-Tag: v247-rc1~275^2~14 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=0ef14adc1c724eee8d5f4db3d298786b209afaa5;p=thirdparty%2Fsystemd.git 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.) --- diff --git a/man/sd_machine_get_class.xml b/man/sd_machine_get_class.xml index cd259c863f9..0a0d601899c 100644 --- a/man/sd_machine_get_class.xml +++ b/man/sd_machine_get_class.xml @@ -35,7 +35,7 @@ int sd_machine_get_ifindices const char* machine - int **ifindices + int **ret_ifindices diff --git a/src/libsystemd/sd-login/sd-login.c b/src/libsystemd/sd-login/sd-login.c index 14e04687206..3828fa58e48 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) { diff --git a/src/systemd/sd-login.h b/src/systemd/sd-login.h index 360f44d341e..6a8c2062591 100644 --- a/src/systemd/sd-login.h +++ b/src/systemd/sd-login.h @@ -199,7 +199,7 @@ int sd_seat_can_graphical(const char *seat); int sd_machine_get_class(const char *machine, char **clazz); /* Return the list if host-side network interface indices of a machine */ -int sd_machine_get_ifindices(const char *machine, int **ifindices); +int sd_machine_get_ifindices(const char *machine, int **ret_ifindices); /* Get all seats, store in *seats. Returns the number of seats. If * seats is NULL, this only returns the number of seats. */