#include "config.h"
#include "log.h"
#include "lxcseccomp.h"
+#include "utils.h"
lxc_log_define(lxc_seccomp, lxc);
uint64_t mask = 0;
enum scmp_compare op = 0;
uint32_t index = 0;
- char s[31] = {0};
+ char s[31] = {0}, v[24] = {0}, m[24] = {0};
char *tmp = NULL;
tmp = strchr(key, '[');
ERROR("Failed to interpret args");
return -1;
}
- ret = sscanf(tmp, "[%i,%lli,%30[^0-9^,],%lli", &index, (long long unsigned int *)&value, s, (long long unsigned int *)&mask);
+ ret = sscanf(tmp, "[%i,%23[^,],%30[^0-9^,],%23[^,]", &index, v, s, m);
if ((ret != 3 && ret != 4) || index >= 6) {
ERROR("Failed to interpret args value");
return -1;
}
+ ret = lxc_safe_uint64(v, &value);
+ if (ret < 0) {
+ ERROR("Invalid argument value");
+ return -1;
+ }
+
+ ret = lxc_safe_uint64(v, &mask);
+ if (ret < 0) {
+ ERROR("Invalid argument mask");
+ return -1;
+ }
+
op = parse_v2_rule_op(s);
if (op == _SCMP_CMP_MAX) {
ERROR("Failed to interpret args operator value");
return 0;
}
+int lxc_safe_uint64(const char *numstr, uint64_t *converted)
+{
+ char *err = NULL;
+ uint64_t u;
+
+ while (isspace(*numstr))
+ numstr++;
+
+ if (*numstr == '-')
+ return -EINVAL;
+
+ errno = 0;
+ u = strtoull(numstr, &err, 0);
+ if (errno == ERANGE && u == ULLONG_MAX)
+ return -ERANGE;
+
+ if (err == numstr || *err != '\0')
+ return -EINVAL;
+
+ *converted = u;
+ return 0;
+}
+
int lxc_safe_int(const char *numstr, int *converted)
{
char *err = NULL;
extern int lxc_safe_long(const char *numstr, long int *converted);
extern int lxc_safe_long_long(const char *numstr, long long int *converted);
extern int lxc_safe_ulong(const char *numstr, unsigned long *converted);
+extern int lxc_safe_uint64(const char *numstr, uint64_t *converted);
/* Handles B, kb, MB, GB. Detects overflows and reports -ERANGE. */
extern int parse_byte_size_string(const char *s, int64_t *converted);