CGROUP2_SUPER_MAGIC);
}
-
static int set_config_cgroup_dir(const char *key, const char *value,
struct lxc_conf *lxc_conf, void *data)
{
if (lxc_config_value_empty(value))
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);
}
if (lxc_config_value_empty(value))
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);
}
if (lxc_config_value_empty(value))
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);
}
if (lxc_config_value_empty(value))
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);
}
__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, ...) \
({ \
typeof(__ret__) __internal_ret__ = (__ret__); \
return strcmp(str, eq) == 0;
}
+static inline bool dotdot(const char *str)
+{
+ return !!strstr(str, "..");
+}
+
#define strnprintf(buf, buf_size, ...) \
({ \
int __ret_strnprintf; \