systemd/strv-cleanup-error-path-loops.patch
Robert Milasan ed987cb954 - 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/package/show/Base:System/systemd?expand=0&rev=331
2013-01-23 13:44:07 +00:00

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