chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Reject invalid quoted strings
[elogind.git]
/
src
/
shared
/
strv.c
diff --git
a/src/shared/strv.c
b/src/shared/strv.c
index 1ef0b26a25b0d6eb091507e7c0281e53be484398..0ac66b927c167d166a4918c7c85fbca5f2cc7780 100644
(file)
--- a/
src/shared/strv.c
+++ b/
src/shared/strv.c
@@
-201,8
+201,7
@@
int strv_extend_strv_concat(char ***a, char **b, const char *suffix) {
}
char **strv_split(const char *s, const char *separator) {
}
char **strv_split(const char *s, const char *separator) {
- char *state;
- char *w;
+ const char *word, *state;
size_t l;
unsigned n, i;
char **r;
size_t l;
unsigned n, i;
char **r;
@@
-210,7
+209,7
@@
char **strv_split(const char *s, const char *separator) {
assert(s);
n = 0;
assert(s);
n = 0;
- FOREACH_WORD_SEPARATOR(w, l, s, separator, state)
+ FOREACH_WORD_SEPARATOR(w
ord
, l, s, separator, state)
n++;
r = new(char*, n+1);
n++;
r = new(char*, n+1);
@@
-218,8
+217,8
@@
char **strv_split(const char *s, const char *separator) {
return NULL;
i = 0;
return NULL;
i = 0;
- FOREACH_WORD_SEPARATOR(w, l, s, separator, state) {
- r[i] = strndup(w, l);
+ FOREACH_WORD_SEPARATOR(w
ord
, l, s, separator, state) {
+ r[i] = strndup(w
ord
, l);
if (!r[i]) {
strv_free(r);
return NULL;
if (!r[i]) {
strv_free(r);
return NULL;
@@
-233,8
+232,7
@@
char **strv_split(const char *s, const char *separator) {
}
char **strv_split_quoted(const char *s) {
}
char **strv_split_quoted(const char *s) {
- char *state;
- char *w;
+ const char *word, *state;
size_t l;
unsigned n, i;
char **r;
size_t l;
unsigned n, i;
char **r;
@@
-242,16
+240,19
@@
char **strv_split_quoted(const char *s) {
assert(s);
n = 0;
assert(s);
n = 0;
- FOREACH_WORD_QUOTED(w, l, s, state)
+ FOREACH_WORD_QUOTED(w
ord
, l, s, state)
n++;
n++;
+ if (*state)
+ /* bad syntax */
+ return NULL;
r = new(char*, n+1);
if (!r)
return NULL;
i = 0;
r = new(char*, n+1);
if (!r)
return NULL;
i = 0;
- FOREACH_WORD_QUOTED(w, l, s, state) {
- r[i] = cunescape_length(w, l);
+ FOREACH_WORD_QUOTED(w
ord
, l, s, state) {
+ r[i] = cunescape_length(w
ord
, l);
if (!r[i]) {
strv_free(r);
return NULL;
if (!r[i]) {
strv_free(r);
return NULL;
@@
-378,6
+379,30
@@
int strv_push(char ***l, char *value) {
return 0;
}
return 0;
}
+int strv_push_prepend(char ***l, char *value) {
+ char **c;
+ unsigned n, i;
+
+ if (!value)
+ return 0;
+
+ n = strv_length(*l);
+ c = new(char*, n + 2);
+ if (!c)
+ return -ENOMEM;
+
+ for (i = 0; i < n; i++)
+ c[i+1] = (*l)[i];
+
+ c[0] = value;
+ c[n+1] = NULL;
+
+ free(*l);
+ *l = c;
+
+ return 0;
+}
+
int strv_consume(char ***l, char *value) {
int r;
int strv_consume(char ***l, char *value) {
int r;
@@
-388,6
+413,16
@@
int strv_consume(char ***l, char *value) {
return r;
}
return r;
}
+int strv_consume_prepend(char ***l, char *value) {
+ int r;
+
+ r = strv_push_prepend(l, value);
+ if (r < 0)
+ free(value);
+
+ return r;
+}
+
int strv_extend(char ***l, const char *value) {
char *v;
int strv_extend(char ***l, const char *value) {
char *v;