X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fshared%2Ffileio.c;h=f10126954b2d4d2b6a53c52cb0eb65e77f385a5c;hb=b5d742138f71e87312541a89aac5657015f50f48;hp=ac1b409a1c7efa1c4aaf274055922a0d7508cd88;hpb=e93c33d4aadb41427f215d43545e7fadc6bcec6f;p=elogind.git diff --git a/src/shared/fileio.c b/src/shared/fileio.c index ac1b409a1..f10126954 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_end(aq); + va_copy(aq, *ap); + + while ((k = va_arg(aq, const char *))) { + char **v; + + v = va_arg(aq, char **); + + if (streq(key, k)) { + va_end(aq); + free(*v); + *v = value; + return 1; + } } + va_end(aq); free(value); return 0; } @@ -585,28 +593,34 @@ 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 (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 { - char ***m = userdata; - char *p; - int r; + if (!utf8_is_valid(key)) { + _cleanup_free_ char *t = utf8_escape_invalid(key); - p = strjoin(key, "=", strempty(value), NULL); - if (!p) - return -ENOMEM; + log_error("%s:%u: invalid UTF-8 for key '%s', ignoring.", + filename, line, t); + return -EINVAL; + } - r = strv_push(m, p); - if (r < 0) { - free(p); - return r; - } + 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.", + filename, line, key, t); + return -EINVAL; } + p = strjoin(key, "=", strempty(value), NULL); + if (!p) + return -ENOMEM; + + r = strv_consume(m, p); + if (r < 0) + return r; + free(value); return 0; }