1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-30 17:18:21 +03:00

libdm: prevent empty config file section names

Change c353949597 to use existing
_dup_string_tok().  alloca() doesn't fail cleanly (and needs
replacing.)
This commit is contained in:
Alasdair G Kergon 2013-12-05 01:09:03 +00:00
parent 76ca82df82
commit b6d3fd62fc
2 changed files with 27 additions and 14 deletions

View File

@ -1,5 +1,6 @@
Version 1.02.84 -
====================================
Allow section names in config file data to be quoted strings.
Close fifos before exiting in dmeventd restart() error path.
Move printf format string directly into dm_asprintf args list.
Catch invalid use of string sort values when reporting numerical fields.

View File

@ -253,11 +253,7 @@ static int _write_value(struct config_output *out, const struct dm_config_value
switch (v->type) {
case DM_CFG_STRING:
if (!(buf = alloca(dm_escaped_len(v->v.str)))) {
log_error("temporary stack allocation for a config "
"string failed");
return 0;
}
buf = alloca(dm_escaped_len(v->v.str));
line_append("\"%s\"", dm_escape_double_quotes(buf, v->v.str));
break;
@ -440,24 +436,40 @@ static struct dm_config_node *_file(struct parser *p)
static struct dm_config_node *_section(struct parser *p)
{
/* IDENTIFIER SECTION_B_CHAR VALUE* SECTION_E_CHAR */
struct dm_config_node *root, *n, *l = NULL;
char *token;
char *str;
if (!(root = _create_node(p->mem))) {
log_error("Failed to allocate section node");
return NULL;
}
if (!(root->key = token = _dup_tok(p)))
return_NULL;
if (p->t == TOK_STRING_ESCAPED) {
token ++; /* OK as the token is pool-allocated */
token[strlen(token) - 1] = 0;
dm_unescape_double_quotes(token);
root->key = token;
if (!(str = _dup_string_tok(p)))
return_NULL;
dm_unescape_double_quotes(str);
root->key = str;
match(TOK_STRING_ESCAPED);
} else
} else if (p->t == TOK_STRING) {
if (!(str = _dup_string_tok(p)))
return_NULL;
root->key = str;
match(TOK_STRING);
} else {
if (!(root->key = _dup_tok(p)))
return_NULL;
match(TOK_IDENTIFIER);
}
if (!strlen(root->key)) {
log_error("Parse error at byte %" PRIptrdiff_t " (line %d): empty section identifier",
p->tb - p->fb + 1, p->line);
return NULL;
}
if (p->t == TOK_SECTION_B) {
match(TOK_SECTION_B);