confile: forbid walking upwards for confile items that modify cgroup layout

parent 7d714159
...@@ -1815,7 +1815,6 @@ static int set_config_cgroup2_controller(const char *key, const char *value, ...@@ -1815,7 +1815,6 @@ static int set_config_cgroup2_controller(const char *key, const char *value,
CGROUP2_SUPER_MAGIC); CGROUP2_SUPER_MAGIC);
} }
static int set_config_cgroup_dir(const char *key, const char *value, static int set_config_cgroup_dir(const char *key, const char *value,
struct lxc_conf *lxc_conf, void *data) struct lxc_conf *lxc_conf, void *data)
{ {
...@@ -1825,6 +1824,9 @@ static int set_config_cgroup_dir(const char *key, const char *value, ...@@ -1825,6 +1824,9 @@ static int set_config_cgroup_dir(const char *key, const char *value,
if (lxc_config_value_empty(value)) if (lxc_config_value_empty(value))
return clr_config_cgroup_dir(key, lxc_conf, NULL); return clr_config_cgroup_dir(key, lxc_conf, NULL);
if (dotdot(value))
return syserrno_set(-EINVAL, "%s paths may not walk upwards via \"../\"", key);
return set_config_path_item(&lxc_conf->cgroup_meta.dir, value); return set_config_path_item(&lxc_conf->cgroup_meta.dir, value);
} }
...@@ -1834,6 +1836,9 @@ static int set_config_cgroup_monitor_dir(const char *key, const char *value, ...@@ -1834,6 +1836,9 @@ static int set_config_cgroup_monitor_dir(const char *key, const char *value,
if (lxc_config_value_empty(value)) if (lxc_config_value_empty(value))
return clr_config_cgroup_monitor_dir(key, lxc_conf, NULL); return clr_config_cgroup_monitor_dir(key, lxc_conf, NULL);
if (dotdot(value))
return syserrno_set(-EINVAL, "%s paths may not walk upwards via \"../\"", key);
return set_config_path_item(&lxc_conf->cgroup_meta.monitor_dir, value); return set_config_path_item(&lxc_conf->cgroup_meta.monitor_dir, value);
} }
...@@ -1843,6 +1848,9 @@ static int set_config_cgroup_monitor_pivot_dir(const char *key, const char *valu ...@@ -1843,6 +1848,9 @@ static int set_config_cgroup_monitor_pivot_dir(const char *key, const char *valu
if (lxc_config_value_empty(value)) if (lxc_config_value_empty(value))
return clr_config_cgroup_monitor_pivot_dir(key, lxc_conf, NULL); return clr_config_cgroup_monitor_pivot_dir(key, lxc_conf, NULL);
if (dotdot(value))
return syserrno_set(-EINVAL, "%s paths may not walk upwards via \"../\"", key);
return set_config_path_item(&lxc_conf->cgroup_meta.monitor_pivot_dir, value); return set_config_path_item(&lxc_conf->cgroup_meta.monitor_pivot_dir, value);
} }
...@@ -1853,6 +1861,9 @@ static int set_config_cgroup_container_dir(const char *key, const char *value, ...@@ -1853,6 +1861,9 @@ static int set_config_cgroup_container_dir(const char *key, const char *value,
if (lxc_config_value_empty(value)) if (lxc_config_value_empty(value))
return clr_config_cgroup_container_dir(key, lxc_conf, NULL); return clr_config_cgroup_container_dir(key, lxc_conf, NULL);
if (dotdot(value))
return syserrno_set(-EINVAL, "%s paths may not walk upwards via \"../\"", key);
return set_config_path_item(&lxc_conf->cgroup_meta.container_dir, value); return set_config_path_item(&lxc_conf->cgroup_meta.container_dir, value);
} }
......
...@@ -501,6 +501,14 @@ __lxc_unused static inline void LXC_##LEVEL(struct lxc_log_locinfo* locinfo, \ ...@@ -501,6 +501,14 @@ __lxc_unused static inline void LXC_##LEVEL(struct lxc_log_locinfo* locinfo, \
__internal_ret__; \ __internal_ret__; \
}) })
#define syserrno_set(__ret__, format, ...) \
({ \
typeof(__ret__) __internal_ret__ = (__ret__); \
errno = abs(__ret__); \
SYSERROR(format, ##__VA_ARGS__); \
__internal_ret__; \
})
#define log_error(__ret__, format, ...) \ #define log_error(__ret__, format, ...) \
({ \ ({ \
typeof(__ret__) __internal_ret__ = (__ret__); \ typeof(__ret__) __internal_ret__ = (__ret__); \
......
...@@ -140,6 +140,11 @@ static inline bool strequal(const char *str, const char *eq) ...@@ -140,6 +140,11 @@ static inline bool strequal(const char *str, const char *eq)
return strcmp(str, eq) == 0; return strcmp(str, eq) == 0;
} }
static inline bool dotdot(const char *str)
{
return !!strstr(str, "..");
}
#define strnprintf(buf, buf_size, ...) \ #define strnprintf(buf, buf_size, ...) \
({ \ ({ \
int __ret_strnprintf; \ int __ret_strnprintf; \
......
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