free(s);
}
+static inline bool
+parse_hex(const char *value, unsigned int *parsed)
+{
+ return strneq(value, "0x", 2) &&
+ safe_atou_base(value, parsed, 16) &&
+ strspn(value, "0123456789xABCDEF") == strlen(value) &&
+ *parsed <= 0xFFFF;
+}
+
/**
* Parse a MatchFooBar=banana line.
*
unsigned int vendor;
check_set_bit(s, M_VID);
- if (!strneq(value, "0x", 2) ||
- !safe_atou_base(value, &vendor, 16) ||
- vendor > 0xFFFF)
+ if (!parse_hex(value, &vendor))
goto out;
s->match.vendor = vendor;
unsigned int product;
check_set_bit(s, M_PID);
- if (!strneq(value, "0x", 2) ||
- !safe_atou_base(value, &product, 16) ||
- product > 0xFFFF)
+ if (!parse_hex(value, &product))
goto out;
s->match.product = product;
unsigned int version;
check_set_bit(s, M_VERSION);
- if (!strneq(value, "0x", 2) ||
- !safe_atou_base(value, &version, 16) ||
- version > 0xFFFF)
+ if (!parse_hex(value, &version))
goto out;
s->match.version = version;