fstab-filter: fix preserve fstab option escaping (#43274)

Fixes #42787.
This commit is contained in:
Yu Watanabe
2026-08-14 00:23:47 +09:00
committed by GitHub
8 changed files with 61 additions and 50 deletions
+1 -1
View File
@@ -78,7 +78,7 @@ int extract_first_word(const char **p, char **ret, const char *separators, Extra
return -EINVAL;
}
if (flags & (EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_SEPARATORS)) {
if (flags & (EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_SEPARATORS|EXTRACT_UNESCAPE_RELAX)) {
bool eight_bit = false;
char32_t u;
+3 -17
View File
@@ -529,7 +529,7 @@ int strv_split_colon_pairs(char ***t, const char *s) {
return (int) n;
}
char* strv_join_full(char * const *l, const char *separator, const char *prefix, bool escape_separator) {
char* strv_join_full(char * const *l, const char *separator, const char *prefix) {
char *r, *e;
size_t n, k, m;
@@ -539,17 +539,12 @@ char* strv_join_full(char * const *l, const char *separator, const char *prefix,
k = strlen(separator);
m = strlen_ptr(prefix);
if (escape_separator) /* If the separator was multi-char, we wouldn't know how to escape it. */
assert(k == 1);
n = 0;
STRV_FOREACH(s, l) {
if (s != l)
n += k;
bool needs_escaping = escape_separator && strchr(*s, *separator);
n += m + strlen(*s) * (1 + needs_escaping);
n += m + strlen(*s);
}
r = new(char, n+1);
@@ -564,16 +559,7 @@ char* strv_join_full(char * const *l, const char *separator, const char *prefix,
if (prefix)
e = stpcpy(e, prefix);
bool needs_escaping = escape_separator && strchr(*s, *separator);
if (needs_escaping)
for (size_t i = 0; (*s)[i]; i++) {
if ((*s)[i] == *separator)
*(e++) = '\\';
*(e++) = (*s)[i];
}
else
e = stpcpy(e, *s);
e = stpcpy(e, *s);
}
*e = 0;
+2 -2
View File
@@ -120,9 +120,9 @@ char** strv_split_newlines(const char *s);
* string in the vector is an empty string. */
int strv_split_colon_pairs(char ***t, const char *s);
char* strv_join_full(char * const *l, const char *separator, const char *prefix, bool escape_separator);
char* strv_join_full(char * const *l, const char *separator, const char *prefix);
static inline char *strv_join(char * const *l, const char *separator) {
return strv_join_full(l, separator, NULL, false);
return strv_join_full(l, separator, NULL);
}
bool strv_overlap(char * const *a, char * const *b) _pure_;