X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fshared%2Ffileio.c;h=0d3f2e90c75d639184307d97cd4101dbb5fa1a84;hb=b6e2f3293d0f9a821819d96038eec2a19062151f;hp=ac1b409a1c7efa1c4aaf274055922a0d7508cd88;hpb=e93c33d4aadb41427f215d43545e7fadc6bcec6f;p=elogind.git diff --git a/src/shared/fileio.c b/src/shared/fileio.c index ac1b409a1..0d3f2e90c 100644 --- a/src/shared/fileio.c +++ b/src/shared/fileio.c @@ -130,7 +130,7 @@ ssize_t sendfile_full(int out_fd, const char *fn) { assert(out_fd > 0); assert(fn); - f = fopen(fn, "r"); + f = fopen(fn, "re"); if (!f) return -errno; @@ -240,6 +240,7 @@ int read_full_file(const char *fn, char **contents, size_t *size) { buf[l] = 0; *contents = buf; + buf = NULL; /* do not free */ if (size) *size = l; @@ -533,35 +534,42 @@ fail: static int parse_env_file_push(const char *filename, unsigned line, const char *key, char *value, void *userdata) { - assert(utf8_is_valid(key)); - if (value && !utf8_is_valid(value)) - /* FIXME: filter UTF-8 */ - log_error("%s:%u: invalid UTF-8 for key %s: '%s', ignoring.", - filename, line, key, value); - else { - const char *k; - va_list* ap = (va_list*) userdata; - va_list aq; + const char *k; + va_list aq, *ap = userdata; - va_copy(aq, *ap); + if (!utf8_is_valid(key)) { + _cleanup_free_ char *p = utf8_escape_invalid(key); - while ((k = va_arg(aq, const char *))) { - char **v; + log_error("%s:%u: invalid UTF-8 in key '%s', ignoring.", + filename, line, p); + return -EINVAL; + } - v = va_arg(aq, char **); + if (value && !utf8_is_valid(value)) { + _cleanup_free_ char *p = utf8_escape_invalid(value); - if (streq(key, k)) { - va_end(aq); - free(*v); - *v = value; - return 1; - } - } + log_error("%s:%u: invalid UTF-8 value for key %s: '%s', ignoring.", + filename, line, key, p); + return -EINVAL; + } + + va_copy(aq, *ap); + + while ((k = va_arg(aq, const char *))) { + char **v; + + v = va_arg(aq, char **); - va_end(aq); + if (streq(key, k)) { + va_end(aq); + free(*v); + *v = value; + return 1; + } } + va_end(aq); free(value); return 0; } @@ -585,26 +593,31 @@ int parse_env_file( static int load_env_file_push(const char *filename, unsigned line, const char *key, char *value, void *userdata) { - assert(utf8_is_valid(key)); + char ***m = userdata; + char *p; + int r; + + if (!utf8_is_valid(key)) { + log_error("%s:%u: invalid UTF-8 for key '%s', ignoring.", + filename, line, key); + return -EINVAL; + } - if (value && !utf8_is_valid(value)) + if (value && !utf8_is_valid(value)) { /* FIXME: filter UTF-8 */ - log_error("%s:%u: invalid UTF-8 for key %s: '%s', ignoring.", + log_error("%s:%u: invalid UTF-8 value for key %s: '%s', ignoring.", filename, line, key, value); - else { - char ***m = userdata; - char *p; - int r; + return -EINVAL; + } - p = strjoin(key, "=", strempty(value), NULL); - if (!p) - return -ENOMEM; + p = strjoin(key, "=", strempty(value), NULL); + if (!p) + return -ENOMEM; - r = strv_push(m, p); - if (r < 0) { - free(p); - return r; - } + r = strv_push(m, p); + if (r < 0) { + free(p); + return r; } free(value);