chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
conf: enforce UTF8 validty everywhere
[elogind.git]
/
src
/
conf-parser.c
diff --git
a/src/conf-parser.c
b/src/conf-parser.c
index c7dd01aa1d5347c3e0355cc1c8548e5ae94208cd..135b175c09a5dd4a5d939a34c41bf01b1121f39a 100644
(file)
--- a/
src/conf-parser.c
+++ b/
src/conf-parser.c
@@
-30,6
+30,7
@@
#include "macro.h"
#include "strv.h"
#include "log.h"
#include "macro.h"
#include "strv.h"
#include "log.h"
+#include "utf8.h"
int config_item_table_lookup(
void *table,
int config_item_table_lookup(
void *table,
@@
-584,14
+585,23
@@
int config_parse_string(
assert(rvalue);
assert(data);
assert(rvalue);
assert(data);
- if (*rvalue) {
- if (!(n = strdup(rvalue)))
- return -ENOMEM;
- } else
- n = NULL;
+ n = cunescape(rvalue);
+ if (!n)
+ return -ENOMEM;
+
+ if (!utf8_is_valid(n)) {
+ log_error("[%s:%u] String is not UTF-8 clean, ignoring assignment: %s", filename, line, rvalue);
+ free(n);
+ return 0;
+ }
free(*s);
free(*s);
- *s = n;
+ if (*n)
+ *s = n;
+ else {
+ free(n);
+ *s = NULL;
+ }
return 0;
}
return 0;
}
@@
-614,12
+624,18
@@
int config_parse_path(
assert(rvalue);
assert(data);
assert(rvalue);
assert(data);
+ if (!utf8_is_valid(rvalue)) {
+ log_error("[%s:%u] Path is not UTF-8 clean, ignoring assignment: %s", filename, line, rvalue);
+ return 0;
+ }
+
if (!path_is_absolute(rvalue)) {
log_error("[%s:%u] Not an absolute path, ignoring: %s", filename, line, rvalue);
return 0;
}
if (!path_is_absolute(rvalue)) {
log_error("[%s:%u] Not an absolute path, ignoring: %s", filename, line, rvalue);
return 0;
}
- if (!(n = strdup(rvalue)))
+ n = strdup(rvalue);
+ if (!n)
return -ENOMEM;
path_kill_slashes(n);
return -ENOMEM;
path_kill_slashes(n);
@@
-646,6
+662,7
@@
int config_parse_strv(
unsigned k;
size_t l;
char *state;
unsigned k;
size_t l;
char *state;
+ int r;
assert(filename);
assert(lvalue);
assert(filename);
assert(lvalue);
@@
-656,7
+673,8
@@
int config_parse_strv(
FOREACH_WORD_QUOTED(w, l, rvalue, state)
k++;
FOREACH_WORD_QUOTED(w, l, rvalue, state)
k++;
- if (!(n = new(char*, k+1)))
+ n = new(char*, k+1);
+ if (!n)
return -ENOMEM;
if (*sv)
return -ENOMEM;
if (*sv)
@@
-665,9
+683,21
@@
int config_parse_strv(
else
k = 0;
else
k = 0;
- FOREACH_WORD_QUOTED(w, l, rvalue, state)
- if (!(n[k++] = cunescape_length(w, l)))
+ FOREACH_WORD_QUOTED(w, l, rvalue, state) {
+ n[k] = cunescape_length(w, l);
+ if (!n[k]) {
+ r = -ENOMEM;
goto fail;
goto fail;
+ }
+
+ if (!utf8_is_valid(n[k])) {
+ log_error("[%s:%u] String is not UTF-8 clean, ignoring assignment: %s", filename, line, rvalue);
+ free(n[k]);
+ continue;
+ }
+
+ k++;
+ }
n[k] = NULL;
free(*sv);
n[k] = NULL;
free(*sv);
@@
-680,7
+710,7
@@
fail:
free(n[k-1]);
free(n);
free(n[k-1]);
free(n);
- return
-ENOMEM
;
+ return
r
;
}
int config_parse_path_strv(
}
int config_parse_path_strv(
@@
-710,7
+740,8
@@
int config_parse_path_strv(
FOREACH_WORD_QUOTED(w, l, rvalue, state)
k++;
FOREACH_WORD_QUOTED(w, l, rvalue, state)
k++;
- if (!(n = new(char*, k+1)))
+ n = new(char*, k+1);
+ if (!n)
return -ENOMEM;
k = 0;
return -ENOMEM;
k = 0;
@@
-719,11
+750,18
@@
int config_parse_path_strv(
n[k] = (*sv)[k];
FOREACH_WORD_QUOTED(w, l, rvalue, state) {
n[k] = (*sv)[k];
FOREACH_WORD_QUOTED(w, l, rvalue, state) {
- if (!(n[k] = cunescape_length(w, l))) {
+ n[k] = strndup(w, l);
+ if (!n[k]) {
r = -ENOMEM;
goto fail;
}
r = -ENOMEM;
goto fail;
}
+ if (!utf8_is_valid(n[k])) {
+ log_error("[%s:%u] Path is not UTF-8 clean, ignoring assignment: %s", filename, line, rvalue);
+ free(n[k]);
+ continue;
+ }
+
if (!path_is_absolute(n[k])) {
log_error("[%s:%u] Not an absolute path, ignoring: %s", filename, line, rvalue);
free(n[k]);
if (!path_is_absolute(n[k])) {
log_error("[%s:%u] Not an absolute path, ignoring: %s", filename, line, rvalue);
free(n[k]);
@@
-731,7
+769,6
@@
int config_parse_path_strv(
}
path_kill_slashes(n[k]);
}
path_kill_slashes(n[k]);
-
k++;
}
k++;
}
@@
-742,7
+779,6
@@
int config_parse_path_strv(
return 0;
fail:
return 0;
fail:
- free(n[k]);
for (; k > 0; k--)
free(n[k-1]);
free(n);
for (; k > 0; k--)
free(n[k-1]);
free(n);