confile: enforce maximum subkey length

parent c3cef319
...@@ -300,12 +300,22 @@ struct lxc_config_t *lxc_get_config_exact(const char *key) ...@@ -300,12 +300,22 @@ struct lxc_config_t *lxc_get_config_exact(const char *key)
return NULL; return NULL;
} }
static inline bool match_config_item(const struct lxc_config_t *entry, /* Assume a reasonable subkey size limit. */
const char *key) #define LXC_SUBKEY_LEN_MAX 256
static inline int match_config_item(const struct lxc_config_t *entry, const char *key)
{ {
size_t len;
if (entry->strict) if (entry->strict)
return strequal(entry->name, key); return strequal(entry->name, key);
return strnequal(entry->name, key, strlen(entry->name));
/* There should be no subkey longer than this. */
len = strnlen(entry->name, LXC_SUBKEY_LEN_MAX);
if (len == LXC_SUBKEY_LEN_MAX)
return error_ret(-E2BIG, "Excessive subkey length");
return strnequal(entry->name, key, len);
} }
struct lxc_config_t *lxc_get_config(const char *key) struct lxc_config_t *lxc_get_config(const char *key)
...@@ -313,8 +323,12 @@ struct lxc_config_t *lxc_get_config(const char *key) ...@@ -313,8 +323,12 @@ struct lxc_config_t *lxc_get_config(const char *key)
for (size_t i = 0; i < ARRAY_SIZE(config_jump_table); i++) { for (size_t i = 0; i < ARRAY_SIZE(config_jump_table); i++) {
struct lxc_config_t *cur = &config_jump_table[i]; struct lxc_config_t *cur = &config_jump_table[i];
if (!match_config_item(cur, key)) switch (match_config_item(cur, key)) {
case 0:
continue; continue;
case -E2BIG:
return NULL;
}
return cur; return cur;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment