mirror of
https://github.com/systemd/systemd
synced 2024-09-20 00:21:55 +00:00
local: fix memory leak when putting together locale settings
Also, we need to use proper strv_env_xyz() calls when putting together the environment array, since otherwise settings won't be properly overriden. And let's get rid of strv_appendf(), is overkill and there was only one user.
This commit is contained in:
parent
6c081276dc
commit
bcd8e6d1bd
Notes:
Lennart Poettering
2013-10-04 17:11:46 +02:00
Backport: bugfix
|
@ -29,6 +29,7 @@
|
|||
#include "virt.h"
|
||||
#include "fileio.h"
|
||||
#include "strv.h"
|
||||
#include "env-util.h"
|
||||
|
||||
enum {
|
||||
/* We don't list LC_ALL here on purpose. People should be
|
||||
|
@ -69,7 +70,7 @@ static const char * const variable_names[_VARIABLE_MAX] = {
|
|||
};
|
||||
|
||||
int locale_setup(char ***environment) {
|
||||
char **env;
|
||||
char **add;
|
||||
char *variables[_VARIABLE_MAX] = {};
|
||||
int r = 0, i;
|
||||
|
||||
|
@ -119,22 +120,44 @@ int locale_setup(char ***environment) {
|
|||
log_warning("Failed to read /etc/locale.conf: %s", strerror(-r));
|
||||
}
|
||||
|
||||
add = NULL;
|
||||
for (i = 0; i < _VARIABLE_MAX; i++) {
|
||||
char *s;
|
||||
|
||||
if (!variables[i])
|
||||
continue;
|
||||
|
||||
env = strv_appendf(*environment, "%s=%s", variable_names[i], variables[i]);
|
||||
if (!env) {
|
||||
s = strjoin(variable_names[i], "=", variables[i], NULL);
|
||||
if (!s) {
|
||||
r = -ENOMEM;
|
||||
goto finish;
|
||||
}
|
||||
|
||||
*environment = env;
|
||||
if (strv_push(&add, s) < 0) {
|
||||
free(s);
|
||||
r = -ENOMEM;
|
||||
goto finish;
|
||||
}
|
||||
}
|
||||
|
||||
if (!strv_isempty(add)) {
|
||||
char **e;
|
||||
|
||||
e = strv_env_merge(2, *environment, add);
|
||||
if (!e) {
|
||||
r = -ENOMEM;
|
||||
goto finish;
|
||||
}
|
||||
|
||||
strv_free(*environment);
|
||||
*environment = e;
|
||||
}
|
||||
|
||||
r = 0;
|
||||
|
||||
finish:
|
||||
strv_free(add);
|
||||
|
||||
for (i = 0; i < _VARIABLE_MAX; i++)
|
||||
free(variables[i]);
|
||||
|
||||
|
|
|
@ -2665,14 +2665,16 @@ void manager_undo_generators(Manager *m) {
|
|||
}
|
||||
|
||||
int manager_environment_add(Manager *m, char **environment) {
|
||||
|
||||
char **e = NULL;
|
||||
assert(m);
|
||||
|
||||
e = strv_env_merge(2, m->environment, environment);
|
||||
if (!e)
|
||||
return -ENOMEM;
|
||||
|
||||
strv_free(m->environment);
|
||||
m->environment = e;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -424,21 +424,6 @@ fail:
|
|||
return NULL;
|
||||
}
|
||||
|
||||
char **strv_appendf(char **l, const char *format, ...) {
|
||||
va_list ap;
|
||||
_cleanup_free_ char *s = NULL;
|
||||
int r;
|
||||
|
||||
va_start(ap, format);
|
||||
r = vasprintf(&s, format, ap);
|
||||
va_end(ap);
|
||||
|
||||
if (r < 0)
|
||||
return NULL;
|
||||
|
||||
return strv_append(l, s);
|
||||
}
|
||||
|
||||
int strv_push(char ***l, char *value) {
|
||||
char **c;
|
||||
unsigned n;
|
||||
|
|
|
@ -42,7 +42,6 @@ unsigned strv_length(char * const *l) _pure_;
|
|||
char **strv_merge(char **a, char **b);
|
||||
char **strv_merge_concat(char **a, char **b, const char *suffix);
|
||||
char **strv_append(char **l, const char *s);
|
||||
char **strv_appendf(char **l, const char *format, ...) _printf_attr_(2, 3);
|
||||
int strv_extend(char ***l, const char *value);
|
||||
int strv_push(char ***l, char *value);
|
||||
|
||||
|
|
Loading…
Reference in a new issue