Fix format-truncation compile failure by typecasting USB IDs (#8250)

This patch adds safe_atoux16 for parsing an unsigned hexadecimal 16bit int, and
uses that for parsing USB device and vendor IDs.

This fixes a compile error with gcc-8 because while we know that USB IDs are 2 bytes,
the compiler does not know that.

../src/udev/udev-builtin-hwdb.c:80:38: error: '%04X' directive output may be
truncated writing between 4 and 8 bytes into a region of size between 2 and 6
[-Werror=format-truncation=]

Signed-off-by: Adam Williamson <awilliam@redhat.com>
Signed-off-by: Patrick Uiterwijk <puiterwijk@redhat.com>
This commit is contained in:
Patrick Uiterwijk
2018-02-22 19:41:30 +01:00
committed by Zbigniew Jędrzejewski-Szmek
parent 6afe9046d5
commit 5547c12503
4 changed files with 71 additions and 7 deletions
+39
View File
@@ -468,6 +468,44 @@ static void test_safe_atoi16(void) {
assert_se(r == -EINVAL);
}
static void test_safe_atoux16(void) {
int r;
uint16_t l;
r = safe_atoux16("1234", &l);
assert_se(r == 0);
assert_se(l == 0x1234);
r = safe_atoux16("abcd", &l);
assert_se(r == 0);
assert_se(l == 0xabcd);
r = safe_atoux16(" 1234", &l);
assert_se(r == 0);
assert_se(l == 0x1234);
r = safe_atoux16("12345", &l);
assert_se(r == -ERANGE);
r = safe_atoux16("-1", &l);
assert_se(r == -ERANGE);
r = safe_atoux16(" -1", &l);
assert_se(r == -ERANGE);
r = safe_atoux16("junk", &l);
assert_se(r == -EINVAL);
r = safe_atoux16("123x", &l);
assert_se(r == -EINVAL);
r = safe_atoux16("12.3", &l);
assert_se(r == -EINVAL);
r = safe_atoux16("", &l);
assert_se(r == -EINVAL);
}
static void test_safe_atou64(void) {
int r;
uint64_t l;
@@ -745,6 +783,7 @@ int main(int argc, char *argv[]) {
test_safe_atolli();
test_safe_atou16();
test_safe_atoi16();
test_safe_atoux16();
test_safe_atou64();
test_safe_atoi64();
test_safe_atod();