diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2016-05-30 18:27:07 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-05-30 18:27:07 -0400 |
commit | 852f42a69b93dc71507adedeed876d57b8c2c2fa (patch) | |
tree | c86cf6f11252d5e07e27006d1f2a2c97da928932 | |
parent | 446985428d2cd10efd5d139c33de16c50ee771ba (diff) | |
parent | bc9dc9d5eec908806f1b15c9ec2253d44dcf7835 (diff) |
Merge branch 'uuid' (lib/uuid fixes from Andy)
Merge lib/uuid fixes from Andy Shevchenko.
* emailed patches from Andy Shevchenko <andriy.shevchenko@linux.intel.com>:
lib/uuid.c: use correct offset in uuid parser
lib/uuid: add a test module
-rw-r--r-- | lib/Kconfig.debug | 3 | ||||
-rw-r--r-- | lib/Makefile | 1 | ||||
-rw-r--r-- | lib/test_uuid.c | 133 | ||||
-rw-r--r-- | lib/uuid.c | 4 |
4 files changed, 139 insertions, 2 deletions
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index 77d7d034bac3..b9cfdbfae9aa 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug | |||
@@ -1841,6 +1841,9 @@ config TEST_BITMAP | |||
1841 | 1841 | ||
1842 | If unsure, say N. | 1842 | If unsure, say N. |
1843 | 1843 | ||
1844 | config TEST_UUID | ||
1845 | tristate "Test functions located in the uuid module at runtime" | ||
1846 | |||
1844 | config TEST_RHASHTABLE | 1847 | config TEST_RHASHTABLE |
1845 | tristate "Perform selftest on resizable hash table" | 1848 | tristate "Perform selftest on resizable hash table" |
1846 | default n | 1849 | default n |
diff --git a/lib/Makefile b/lib/Makefile index 499fb354d627..ff6a7a6c6395 100644 --- a/lib/Makefile +++ b/lib/Makefile | |||
@@ -58,6 +58,7 @@ obj-$(CONFIG_TEST_STATIC_KEYS) += test_static_keys.o | |||
58 | obj-$(CONFIG_TEST_STATIC_KEYS) += test_static_key_base.o | 58 | obj-$(CONFIG_TEST_STATIC_KEYS) += test_static_key_base.o |
59 | obj-$(CONFIG_TEST_PRINTF) += test_printf.o | 59 | obj-$(CONFIG_TEST_PRINTF) += test_printf.o |
60 | obj-$(CONFIG_TEST_BITMAP) += test_bitmap.o | 60 | obj-$(CONFIG_TEST_BITMAP) += test_bitmap.o |
61 | obj-$(CONFIG_TEST_UUID) += test_uuid.o | ||
61 | 62 | ||
62 | ifeq ($(CONFIG_DEBUG_KOBJECT),y) | 63 | ifeq ($(CONFIG_DEBUG_KOBJECT),y) |
63 | CFLAGS_kobject.o += -DDEBUG | 64 | CFLAGS_kobject.o += -DDEBUG |
diff --git a/lib/test_uuid.c b/lib/test_uuid.c new file mode 100644 index 000000000000..547d3127a3cf --- /dev/null +++ b/lib/test_uuid.c | |||
@@ -0,0 +1,133 @@ | |||
1 | /* | ||
2 | * Test cases for lib/uuid.c module. | ||
3 | */ | ||
4 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt | ||
5 | |||
6 | #include <linux/init.h> | ||
7 | #include <linux/kernel.h> | ||
8 | #include <linux/module.h> | ||
9 | #include <linux/string.h> | ||
10 | #include <linux/uuid.h> | ||
11 | |||
12 | struct test_uuid_data { | ||
13 | const char *uuid; | ||
14 | uuid_le le; | ||
15 | uuid_be be; | ||
16 | }; | ||
17 | |||
18 | static const struct test_uuid_data test_uuid_test_data[] = { | ||
19 | { | ||
20 | .uuid = "c33f4995-3701-450e-9fbf-206a2e98e576", | ||
21 | .le = UUID_LE(0xc33f4995, 0x3701, 0x450e, 0x9f, 0xbf, 0x20, 0x6a, 0x2e, 0x98, 0xe5, 0x76), | ||
22 | .be = UUID_BE(0xc33f4995, 0x3701, 0x450e, 0x9f, 0xbf, 0x20, 0x6a, 0x2e, 0x98, 0xe5, 0x76), | ||
23 | }, | ||
24 | { | ||
25 | .uuid = "64b4371c-77c1-48f9-8221-29f054fc023b", | ||
26 | .le = UUID_LE(0x64b4371c, 0x77c1, 0x48f9, 0x82, 0x21, 0x29, 0xf0, 0x54, 0xfc, 0x02, 0x3b), | ||
27 | .be = UUID_BE(0x64b4371c, 0x77c1, 0x48f9, 0x82, 0x21, 0x29, 0xf0, 0x54, 0xfc, 0x02, 0x3b), | ||
28 | }, | ||
29 | { | ||
30 | .uuid = "0cb4ddff-a545-4401-9d06-688af53e7f84", | ||
31 | .le = UUID_LE(0x0cb4ddff, 0xa545, 0x4401, 0x9d, 0x06, 0x68, 0x8a, 0xf5, 0x3e, 0x7f, 0x84), | ||
32 | .be = UUID_BE(0x0cb4ddff, 0xa545, 0x4401, 0x9d, 0x06, 0x68, 0x8a, 0xf5, 0x3e, 0x7f, 0x84), | ||
33 | }, | ||
34 | }; | ||
35 | |||
36 | static const char * const test_uuid_wrong_data[] = { | ||
37 | "c33f4995-3701-450e-9fbf206a2e98e576 ", /* no hyphen(s) */ | ||
38 | "64b4371c-77c1-48f9-8221-29f054XX023b", /* invalid character(s) */ | ||
39 | "0cb4ddff-a545-4401-9d06-688af53e", /* not enough data */ | ||
40 | }; | ||
41 | |||
42 | static unsigned total_tests __initdata; | ||
43 | static unsigned failed_tests __initdata; | ||
44 | |||
45 | static void __init test_uuid_failed(const char *prefix, bool wrong, bool be, | ||
46 | const char *data, const char *actual) | ||
47 | { | ||
48 | pr_err("%s test #%u %s %s data: '%s'\n", | ||
49 | prefix, | ||
50 | total_tests, | ||
51 | wrong ? "passed on wrong" : "failed on", | ||
52 | be ? "BE" : "LE", | ||
53 | data); | ||
54 | if (actual && *actual) | ||
55 | pr_err("%s test #%u actual data: '%s'\n", | ||
56 | prefix, | ||
57 | total_tests, | ||
58 | actual); | ||
59 | failed_tests++; | ||
60 | } | ||
61 | |||
62 | static void __init test_uuid_test(const struct test_uuid_data *data) | ||
63 | { | ||
64 | uuid_le le; | ||
65 | uuid_be be; | ||
66 | char buf[48]; | ||
67 | |||
68 | /* LE */ | ||
69 | total_tests++; | ||
70 | if (uuid_le_to_bin(data->uuid, &le)) | ||
71 | test_uuid_failed("conversion", false, false, data->uuid, NULL); | ||
72 | |||
73 | total_tests++; | ||
74 | if (uuid_le_cmp(data->le, le)) { | ||
75 | sprintf(buf, "%pUl", &le); | ||
76 | test_uuid_failed("cmp", false, false, data->uuid, buf); | ||
77 | } | ||
78 | |||
79 | /* BE */ | ||
80 | total_tests++; | ||
81 | if (uuid_be_to_bin(data->uuid, &be)) | ||
82 | test_uuid_failed("conversion", false, true, data->uuid, NULL); | ||
83 | |||
84 | total_tests++; | ||
85 | if (uuid_be_cmp(data->be, be)) { | ||
86 | sprintf(buf, "%pUb", &be); | ||
87 | test_uuid_failed("cmp", false, true, data->uuid, buf); | ||
88 | } | ||
89 | } | ||
90 | |||
91 | static void __init test_uuid_wrong(const char *data) | ||
92 | { | ||
93 | uuid_le le; | ||
94 | uuid_be be; | ||
95 | |||
96 | /* LE */ | ||
97 | total_tests++; | ||
98 | if (!uuid_le_to_bin(data, &le)) | ||
99 | test_uuid_failed("negative", true, false, data, NULL); | ||
100 | |||
101 | /* BE */ | ||
102 | total_tests++; | ||
103 | if (!uuid_be_to_bin(data, &be)) | ||
104 | test_uuid_failed("negative", true, true, data, NULL); | ||
105 | } | ||
106 | |||
107 | static int __init test_uuid_init(void) | ||
108 | { | ||
109 | unsigned int i; | ||
110 | |||
111 | for (i = 0; i < ARRAY_SIZE(test_uuid_test_data); i++) | ||
112 | test_uuid_test(&test_uuid_test_data[i]); | ||
113 | |||
114 | for (i = 0; i < ARRAY_SIZE(test_uuid_wrong_data); i++) | ||
115 | test_uuid_wrong(test_uuid_wrong_data[i]); | ||
116 | |||
117 | if (failed_tests == 0) | ||
118 | pr_info("all %u tests passed\n", total_tests); | ||
119 | else | ||
120 | pr_err("failed %u out of %u tests\n", failed_tests, total_tests); | ||
121 | |||
122 | return failed_tests ? -EINVAL : 0; | ||
123 | } | ||
124 | module_init(test_uuid_init); | ||
125 | |||
126 | static void __exit test_uuid_exit(void) | ||
127 | { | ||
128 | /* do nothing */ | ||
129 | } | ||
130 | module_exit(test_uuid_exit); | ||
131 | |||
132 | MODULE_AUTHOR("Andy Shevchenko <andriy.shevchenko@linux.intel.com>"); | ||
133 | MODULE_LICENSE("Dual BSD/GPL"); | ||
diff --git a/lib/uuid.c b/lib/uuid.c index e116ae5fa00f..37687af77ff8 100644 --- a/lib/uuid.c +++ b/lib/uuid.c | |||
@@ -106,8 +106,8 @@ static int __uuid_to_bin(const char *uuid, __u8 b[16], const u8 ei[16]) | |||
106 | return -EINVAL; | 106 | return -EINVAL; |
107 | 107 | ||
108 | for (i = 0; i < 16; i++) { | 108 | for (i = 0; i < 16; i++) { |
109 | int hi = hex_to_bin(uuid[si[i]] + 0); | 109 | int hi = hex_to_bin(uuid[si[i] + 0]); |
110 | int lo = hex_to_bin(uuid[si[i]] + 1); | 110 | int lo = hex_to_bin(uuid[si[i] + 1]); |
111 | 111 | ||
112 | b[ei[i]] = (hi << 4) | lo; | 112 | b[ei[i]] = (hi << 4) | lo; |
113 | } | 113 | } |