forked from pool/systemd
429339fe2c
- Add systemctl-options.patch: handle SYSTEMCTL_OPTIONS internaly (bnc#798620). - Update crypt-loop-file.patch to correctly detect crypto loop files (bnc#799514). - Add journalctl-remove-leftover-message.patch: remove debug message in systemctl. - Add job-avoid-recursion-when-cancelling.patch: prevent potential recursion when cancelling a service. - Add sysctl-parse-all-keys.patch: ensure sysctl file is fully parsed. - Add journal-fix-cutoff-max-date.patch: fix computation of cutoff max date for journal. - Add reword-rescue-mode-hints.patch: reword rescue prompt. - Add improve-overflow-checks.patch: improve time overflow checks. - Add fix-swap-behaviour-with-symlinks.patch: fix swap behaviour with symlinks. - Add hostnamectl-fix-set-hostname-with-no-argument.patch: ensure hostnamectl requires an argument when called with set-hostname option. - Add agetty-overrides-term.patch: pass correctly terminal type to agetty. - Add check-for-empty-strings-in-strto-conversions.patch: better check for empty strings in strto* conversions. - Add strv-cleanup-error-path-loops.patch: cleanup strv on error path. - Add cryptsetup-handle-plain.patch: correctly handle "plain" option in cryptsetup. - Add fstab-generator-improve-error-message.patch: improve error message in fstab-generator. - Add delta-accept-t-option.patch: accept -t option in OBS-URL: https://build.opensuse.org/request/show/149703 OBS-URL: https://build.opensuse.org/package/show/Base:System/systemd?expand=0&rev=331
239 lines
5.8 KiB
Diff
239 lines
5.8 KiB
Diff
From 1fd8d04e384ae2066c02129b033c6be509edfd67 Mon Sep 17 00:00:00 2001
|
|
From: Lennart Poettering <lennart@poettering.net>
|
|
Date: Tue, 30 Oct 2012 18:29:45 +0100
|
|
Subject: [PATCH] strv: cleanup error path loops
|
|
|
|
https://bugzilla.redhat.com/show_bug.cgi?id=858799
|
|
---
|
|
src/shared/strv.c | 100 ++++++++++++++++++++++++++---------------------------
|
|
1 file changed, 49 insertions(+), 51 deletions(-)
|
|
|
|
diff --git a/src/shared/strv.c b/src/shared/strv.c
|
|
index 1b8e27b..6b76d0e 100644
|
|
--- a/src/shared/strv.c
|
|
+++ b/src/shared/strv.c
|
|
@@ -75,25 +75,21 @@ void strv_freep(char ***l) {
|
|
char **strv_copy(char **l) {
|
|
char **r, **k;
|
|
|
|
- k = r = new(char*, strv_length(l)+1);
|
|
- if (!k)
|
|
+ k = r = new(char*, strv_length(l) + 1);
|
|
+ if (!r)
|
|
return NULL;
|
|
|
|
if (l)
|
|
- for (; *l; k++, l++)
|
|
- if (!(*k = strdup(*l)))
|
|
- goto fail;
|
|
+ for (; *l; k++, l++) {
|
|
+ *k = strdup(*l);
|
|
+ if (!*k) {
|
|
+ strv_free(r);
|
|
+ return NULL;
|
|
+ }
|
|
+ }
|
|
|
|
*k = NULL;
|
|
return r;
|
|
-
|
|
-fail:
|
|
- for (k--; k >= r; k--)
|
|
- free(*k);
|
|
-
|
|
- free(r);
|
|
-
|
|
- return NULL;
|
|
}
|
|
|
|
unsigned strv_length(char **l) {
|
|
@@ -163,13 +159,7 @@ char **strv_new_ap(const char *x, va_list ap) {
|
|
return a;
|
|
|
|
fail:
|
|
-
|
|
- for (; i > 0; i--)
|
|
- if (a[i-1])
|
|
- free(a[i-1]);
|
|
-
|
|
- free(a);
|
|
-
|
|
+ strv_free(a);
|
|
return NULL;
|
|
}
|
|
|
|
@@ -265,16 +255,21 @@ char **strv_split(const char *s, const char *separator) {
|
|
FOREACH_WORD_SEPARATOR(w, l, s, separator, state)
|
|
n++;
|
|
|
|
- if (!(r = new(char*, n+1)))
|
|
+ r = new(char*, n+1);
|
|
+ if (!r)
|
|
return NULL;
|
|
|
|
i = 0;
|
|
- FOREACH_WORD_SEPARATOR(w, l, s, separator, state)
|
|
- if (!(r[i++] = strndup(w, l))) {
|
|
+ FOREACH_WORD_SEPARATOR(w, l, s, separator, state) {
|
|
+ r[i] = strndup(w, l);
|
|
+ if (!r[i]) {
|
|
strv_free(r);
|
|
return NULL;
|
|
}
|
|
|
|
+ i++;
|
|
+ }
|
|
+
|
|
r[i] = NULL;
|
|
return r;
|
|
}
|
|
@@ -292,15 +287,19 @@ char **strv_split_quoted(const char *s) {
|
|
FOREACH_WORD_QUOTED(w, l, s, state)
|
|
n++;
|
|
|
|
- if (!(r = new(char*, n+1)))
|
|
+ r = new(char*, n+1);
|
|
+ if (!r)
|
|
return NULL;
|
|
|
|
i = 0;
|
|
- FOREACH_WORD_QUOTED(w, l, s, state)
|
|
- if (!(r[i++] = cunescape_length(w, l))) {
|
|
+ FOREACH_WORD_QUOTED(w, l, s, state) {
|
|
+ r[i] = cunescape_length(w, l);
|
|
+ if (!r[i]) {
|
|
strv_free(r);
|
|
return NULL;
|
|
}
|
|
+ i++;
|
|
+ }
|
|
|
|
r[i] = NULL;
|
|
return r;
|
|
@@ -323,7 +322,8 @@ char *strv_join(char **l, const char *separator) {
|
|
n += strlen(*s);
|
|
}
|
|
|
|
- if (!(r = new(char, n+1)))
|
|
+ r = new(char, n+1);
|
|
+ if (!r)
|
|
return NULL;
|
|
|
|
e = r;
|
|
@@ -352,22 +352,21 @@ char **strv_append(char **l, const char *s) {
|
|
if (!r)
|
|
return NULL;
|
|
|
|
- for (k = r; *l; k++, l++)
|
|
- if (!(*k = strdup(*l)))
|
|
+ for (k = r; *l; k++, l++) {
|
|
+ *k = strdup(*l);
|
|
+ if (!*k)
|
|
goto fail;
|
|
+ }
|
|
|
|
- if (!(*(k++) = strdup(s)))
|
|
+ k[0] = strdup(s);
|
|
+ if (!k[0])
|
|
goto fail;
|
|
|
|
- *k = NULL;
|
|
+ k[1] = NULL;
|
|
return r;
|
|
|
|
fail:
|
|
- for (k--; k >= r; k--)
|
|
- free(*k);
|
|
-
|
|
- free(r);
|
|
-
|
|
+ strv_free(r);
|
|
return NULL;
|
|
}
|
|
|
|
@@ -462,7 +461,8 @@ static int env_append(char **r, char ***k, char **a) {
|
|
else
|
|
free(*j);
|
|
|
|
- if (!(*j = strdup(*a)))
|
|
+ *j = strdup(*a);
|
|
+ if (!*j)
|
|
return -ENOMEM;
|
|
}
|
|
|
|
@@ -484,7 +484,8 @@ char **strv_env_merge(unsigned n_lists, ...) {
|
|
}
|
|
va_end(ap);
|
|
|
|
- if (!(r = new(char*, n+1)))
|
|
+ r = new(char*, n+1);
|
|
+ if (!r)
|
|
return NULL;
|
|
|
|
k = r;
|
|
@@ -503,11 +504,7 @@ char **strv_env_merge(unsigned n_lists, ...) {
|
|
|
|
fail:
|
|
va_end(ap);
|
|
-
|
|
- for (k--; k >= r; k--)
|
|
- free(*k);
|
|
-
|
|
- free(r);
|
|
+ strv_free(r);
|
|
|
|
return NULL;
|
|
}
|
|
@@ -619,7 +616,8 @@ char **strv_env_set(char **x, const char *p) {
|
|
|
|
/* Overrides the env var setting of p, returns a new copy */
|
|
|
|
- if (!(r = new(char*, strv_length(x)+2)))
|
|
+ r = new(char*, strv_length(x)+2);
|
|
+ if (!r)
|
|
return NULL;
|
|
|
|
k = r;
|
|
@@ -634,11 +632,7 @@ char **strv_env_set(char **x, const char *p) {
|
|
return r;
|
|
|
|
fail:
|
|
- for (k--; k >= r; k--)
|
|
- free(*k);
|
|
-
|
|
- free(r);
|
|
-
|
|
+ strv_free(r);
|
|
return NULL;
|
|
|
|
}
|
|
@@ -698,7 +692,8 @@ char **strv_parse_nulstr(const char *s, size_t l) {
|
|
if (s[l-1] != 0)
|
|
c++;
|
|
|
|
- if (!(v = new0(char*, c+1)))
|
|
+ v = new0(char*, c+1);
|
|
+ if (!v)
|
|
return NULL;
|
|
|
|
p = s;
|
|
@@ -707,11 +702,14 @@ char **strv_parse_nulstr(const char *s, size_t l) {
|
|
|
|
e = memchr(p, 0, s + l - p);
|
|
|
|
- if (!(v[i++] = strndup(p, e ? e - p : s + l - p))) {
|
|
+ v[i] = strndup(p, e ? e - p : s + l - p);
|
|
+ if (!v[i]) {
|
|
strv_free(v);
|
|
return NULL;
|
|
}
|
|
|
|
+ i++;
|
|
+
|
|
if (!e)
|
|
break;
|
|
|
|
--
|
|
1.7.10.4
|
|
|