X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fshared%2Fdbus-common.c;fp=src%2Fshared%2Fdbus-common.c;h=3ba2d87c4de0042399737223a40be87693fed4c8;hb=74dcc2df7b2a340c3e1fe9e61e5c8deb324c83d7;hp=c727cae7cd3c2fdb259dad9629d52e4a08803172;hpb=b47d419c25ecc735615a1088060c1ec8bef1e41f;p=elogind.git diff --git a/src/shared/dbus-common.c b/src/shared/dbus-common.c index c727cae7c..3ba2d87c4 100644 --- a/src/shared/dbus-common.c +++ b/src/shared/dbus-common.c @@ -934,7 +934,7 @@ int bus_parse_strv_iter(DBusMessageIter *iter, char ***_l) { int bus_parse_strv_pairs_iter(DBusMessageIter *iter, char ***_l) { DBusMessageIter sub, sub2; unsigned n = 0, i = 0; - char **l; + _cleanup_strv_free_ char **l = NULL; assert(iter); assert(_l); @@ -953,6 +953,7 @@ int bus_parse_strv_pairs_iter(DBusMessageIter *iter, char ***_l) { l = new(char*, n*2+1); if (!l) return -ENOMEM; + l[0] = NULL; /* make sure that l is properly terminated at all times */ dbus_message_iter_recurse(iter, &sub); @@ -968,26 +969,25 @@ int bus_parse_strv_pairs_iter(DBusMessageIter *iter, char ***_l) { return -EINVAL; l[i] = strdup(a); - if (!l[i]) { - strv_free(l); + if (!l[i]) return -ENOMEM; - } + i++; - l[++i] = strdup(b); - if (!l[i]) { - strv_free(l); + l[i] = strdup(b); + if (!l[i]) return -ENOMEM; - } - i++; + dbus_message_iter_next(&sub); } assert(i == n*2); l[i] = NULL; - if (_l) + if (_l) { *_l = l; + l = NULL; /* avoid freeing */ + } return 0; }