X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fbasic%2Ffileio.c;fp=src%2Fbasic%2Ffileio.c;h=f4915b28a7092f91d2c3d7ae5f8c2582738b5cf6;hb=648294227e8247f729d8cca927d3445ab1836f30;hp=5b20fbb49cbb15149ad7a714876bf503b3ae604a;hpb=910c586574a52c6b4cbc6638193797008da076c7;p=elogind.git diff --git a/src/basic/fileio.c b/src/basic/fileio.c index 5b20fbb49..f4915b28a 100644 --- a/src/basic/fileio.c +++ b/src/basic/fileio.c @@ -585,9 +585,14 @@ fail: return r; } -static int check_utf8ness_and_warn( +static int parse_env_file_push( const char *filename, unsigned line, - const char *key, char *value) { + const char *key, char *value, + void *userdata, + int *n_pushed) { + + const char *k; + va_list aq, *ap = userdata; if (!utf8_is_valid(key)) { _cleanup_free_ char *p = NULL; @@ -605,23 +610,6 @@ static int check_utf8ness_and_warn( return -EINVAL; } - return 0; -} - -static int parse_env_file_push( - const char *filename, unsigned line, - const char *key, char *value, - void *userdata, - int *n_pushed) { - - const char *k; - va_list aq, *ap = userdata; - int r; - - r = check_utf8ness_and_warn(filename, line, key, value); - if (r < 0) - return r; - va_copy(aq, *ap); while ((k = va_arg(aq, const char *))) { @@ -674,19 +662,27 @@ static int load_env_file_push( char *p; int r; - r = check_utf8ness_and_warn(filename, line, key, value); - if (r < 0) - return r; + if (!utf8_is_valid(key)) { + _cleanup_free_ char *t = utf8_escape_invalid(key); + + log_error("%s:%u: invalid UTF-8 for key '%s', ignoring.", strna(filename), line, t); + return -EINVAL; + } + + if (value && !utf8_is_valid(value)) { + _cleanup_free_ char *t = utf8_escape_invalid(value); + + log_error("%s:%u: invalid UTF-8 value for key %s: '%s', ignoring.", strna(filename), line, key, t); + return -EINVAL; + } - p = strjoin(key, "=", value); + p = strjoin(key, "=", strempty(value)); if (!p) return -ENOMEM; - r = strv_env_replace(m, p); - if (r < 0) { - free(p); + r = strv_consume(m, p); + if (r < 0) return r; - } if (n_pushed) (*n_pushed)++; @@ -720,9 +716,19 @@ static int load_env_file_push_pairs( char ***m = userdata; int r; - r = check_utf8ness_and_warn(filename, line, key, value); - if (r < 0) - return r; + if (!utf8_is_valid(key)) { + _cleanup_free_ char *t = utf8_escape_invalid(key); + + log_error("%s:%u: invalid UTF-8 for key '%s', ignoring.", strna(filename), line, t); + return -EINVAL; + } + + if (value && !utf8_is_valid(value)) { + _cleanup_free_ char *t = utf8_escape_invalid(value); + + log_error("%s:%u: invalid UTF-8 value for key %s: '%s', ignoring.", strna(filename), line, key, t); + return -EINVAL; + } r = strv_extend(m, key); if (r < 0) @@ -761,51 +767,6 @@ int load_env_file_pairs(FILE *f, const char *fname, const char *newline, char ** return 0; } -static int merge_env_file_push( - const char *filename, unsigned line, - const char *key, char *value, - void *userdata, - int *n_pushed) { - - char ***env = userdata; - char *expanded_value; - - assert(env); - - if (!value) { - log_error("%s:%u: invalid syntax (around \"%s\"), ignoring.", strna(filename), line, key); - return 0; - } - - if (!env_name_is_valid(key)) { - log_error("%s:%u: invalid variable name \"%s\", ignoring.", strna(filename), line, key); - return 0; - } - - expanded_value = replace_env(value, *env, - REPLACE_ENV_USE_ENVIRONMENT| - REPLACE_ENV_ALLOW_BRACELESS| - REPLACE_ENV_ALLOW_EXTENDED); - if (!expanded_value) - return -ENOMEM; - - free_and_replace(value, expanded_value); - - return load_env_file_push(filename, line, key, value, env, n_pushed); -} - -int merge_env_file( - char ***env, - FILE *f, - const char *fname) { - - /* NOTE: this function supports braceful and braceless variable expansions, - * plus "extended" substitutions, unlike other exported parsing functions. - */ - - return parse_env_file_internal(f, fname, NEWLINE, merge_env_file_push, env, NULL); -} - static void write_env_var(FILE *f, const char *v) { const char *p; @@ -1385,25 +1346,6 @@ int open_tmpfile_linkable(const char *target, int flags, char **ret_path) { return fd; } -int open_serialization_fd(const char *ident) { - int fd = -1; - - fd = memfd_create(ident, MFD_CLOEXEC); - if (fd < 0) { - const char *path; - - path = getpid() == 1 ? "/run/systemd" : "/tmp"; - fd = open_tmpfile_unlinkable(path, O_RDWR|O_CLOEXEC); - if (fd < 0) - return fd; - - log_debug("Serializing %s to %s.", ident, path); - } else - log_debug("Serializing %s to memfd.", ident); - - return fd; -} - int link_tmpfile(int fd, const char *path, const char *target) { assert(fd >= 0); @@ -1472,22 +1414,3 @@ int read_nul_string(FILE *f, char **ret) { return 0; } - -int mkdtemp_malloc(const char *template, char **ret) { - char *p; - - assert(template); - assert(ret); - - p = strdup(template); - if (!p) - return -ENOMEM; - - if (!mkdtemp(p)) { - free(p); - return -errno; - } - - *ret = p; - return 0; -}