X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fshared%2Ffileio.c;h=c7b2cd85b94b8cc0eacc452fb70c5e4ed4f3e0df;hb=76cf10dab7a36653a159f0e87c46a13df494474f;hp=ede88196b5f1a9374a5b387a9d72278bf86255cb;hpb=d78a28e3d7c8736d9addc2e45762d0f511ebbcdb;p=elogind.git diff --git a/src/shared/fileio.c b/src/shared/fileio.c index ede88196b..c7b2cd85b 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; @@ -294,7 +294,7 @@ static int parse_env_file_internal( state = KEY; last_key_whitespace = (size_t) -1; - if (!greedy_realloc((void**) &key, &key_alloc, n_key+2)) { + if (!GREEDY_REALLOC(key, key_alloc, n_key+2)) { r = -ENOMEM; goto fail; } @@ -317,7 +317,7 @@ static int parse_env_file_internal( else if (last_key_whitespace == (size_t) -1) last_key_whitespace = n_key; - if (!greedy_realloc((void**) &key, &key_alloc, n_key+2)) { + if (!GREEDY_REALLOC(key, key_alloc, n_key+2)) { r = -ENOMEM; goto fail; } @@ -357,7 +357,7 @@ static int parse_env_file_internal( else if (!strchr(WHITESPACE, c)) { state = VALUE; - if (!greedy_realloc((void**) &value, &value_alloc, n_value+2)) { + if (!GREEDY_REALLOC(value, value_alloc, n_value+2)) { r = -ENOMEM; goto fail; } @@ -402,7 +402,7 @@ static int parse_env_file_internal( else if (last_value_whitespace == (size_t) -1) last_value_whitespace = n_value; - if (!greedy_realloc((void**) &value, &value_alloc, n_value+2)) { + if (!GREEDY_REALLOC(value, value_alloc, n_value+2)) { r = -ENOMEM; goto fail; } @@ -417,7 +417,7 @@ static int parse_env_file_internal( if (!strchr(newline, c)) { /* Escaped newlines we eat up entirely */ - if (!greedy_realloc((void**) &value, &value_alloc, n_value+2)) { + if (!GREEDY_REALLOC(value, value_alloc, n_value+2)) { r = -ENOMEM; goto fail; } @@ -432,7 +432,7 @@ static int parse_env_file_internal( else if (c == '\\') state = SINGLE_QUOTE_VALUE_ESCAPE; else { - if (!greedy_realloc((void**) &value, &value_alloc, n_value+2)) { + if (!GREEDY_REALLOC(value, value_alloc, n_value+2)) { r = -ENOMEM; goto fail; } @@ -446,7 +446,7 @@ static int parse_env_file_internal( state = SINGLE_QUOTE_VALUE; if (!strchr(newline, c)) { - if (!greedy_realloc((void**) &value, &value_alloc, n_value+2)) { + if (!GREEDY_REALLOC(value, value_alloc, n_value+2)) { r = -ENOMEM; goto fail; } @@ -461,7 +461,7 @@ static int parse_env_file_internal( else if (c == '\\') state = DOUBLE_QUOTE_VALUE_ESCAPE; else { - if (!greedy_realloc((void**) &value, &value_alloc, n_value+2)) { + if (!GREEDY_REALLOC(value, value_alloc, n_value+2)) { r = -ENOMEM; goto fail; } @@ -475,7 +475,7 @@ static int parse_env_file_internal( state = DOUBLE_QUOTE_VALUE; if (!strchr(newline, c)) { - if (!greedy_realloc((void**) &value, &value_alloc, n_value+2)) { + if (!GREEDY_REALLOC(value, value_alloc, n_value+2)) { r = -ENOMEM; goto fail; } @@ -534,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; } @@ -586,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; }