shared: use _cleanup_ in specifier_printf (#7586)

Follow-up for e62d316561.
This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2017-12-08 17:28:02 +01:00 committed by Evgeny Vereshchagin
parent 848f01784e
commit 8208c8f25d

View file

@ -46,10 +46,11 @@
#define POSSIBLE_SPECIFIERS ALPHANUMERICAL "%" #define POSSIBLE_SPECIFIERS ALPHANUMERICAL "%"
int specifier_printf(const char *text, const Specifier table[], void *userdata, char **_ret) { int specifier_printf(const char *text, const Specifier table[], void *userdata, char **_ret) {
char *ret, *t; size_t l;
_cleanup_free_ char *ret = NULL;
char *t;
const char *f; const char *f;
bool percent = false; bool percent = false;
size_t l;
int r; int r;
assert(text); assert(text);
@ -80,32 +81,25 @@ int specifier_printf(const char *text, const Specifier table[], void *userdata,
size_t k, j; size_t k, j;
r = i->lookup(i->specifier, i->data, userdata, &w); r = i->lookup(i->specifier, i->data, userdata, &w);
if (r < 0) { if (r < 0)
free(ret);
return r; return r;
}
j = t - ret; j = t - ret;
k = strlen(w); k = strlen(w);
n = new(char, j + k + l + 1); n = new(char, j + k + l + 1);
if (!n) { if (!n)
free(ret);
return -ENOMEM; return -ENOMEM;
}
memcpy(n, ret, j); memcpy(n, ret, j);
memcpy(n + j, w, k); memcpy(n + j, w, k);
free(ret); free_and_replace(ret, n);
t = ret + j + k;
ret = n; } else if (strchr(POSSIBLE_SPECIFIERS, *f))
t = n + j + k;
} else if (strchr(POSSIBLE_SPECIFIERS, *f)) {
/* Oops, an unknown specifier. */ /* Oops, an unknown specifier. */
free(ret);
return -EBADSLT; return -EBADSLT;
} else { else {
*(t++) = '%'; *(t++) = '%';
*(t++) = *f; *(t++) = *f;
} }
@ -124,6 +118,7 @@ int specifier_printf(const char *text, const Specifier table[], void *userdata,
*t = 0; *t = 0;
*_ret = ret; *_ret = ret;
ret = NULL;
return 0; return 0;
} }