diff options
Diffstat (limited to 'drivers/ssb/sprom.c')
-rw-r--r-- | drivers/ssb/sprom.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/drivers/ssb/sprom.c b/drivers/ssb/sprom.c index 580f779ecf49..d0e6762fec50 100644 --- a/drivers/ssb/sprom.c +++ b/drivers/ssb/sprom.c | |||
@@ -13,6 +13,8 @@ | |||
13 | 13 | ||
14 | #include "ssb_private.h" | 14 | #include "ssb_private.h" |
15 | 15 | ||
16 | #include <linux/ctype.h> | ||
17 | |||
16 | 18 | ||
17 | static const struct ssb_sprom *fallback_sprom; | 19 | static const struct ssb_sprom *fallback_sprom; |
18 | 20 | ||
@@ -33,17 +35,27 @@ static int sprom2hex(const u16 *sprom, char *buf, size_t buf_len, | |||
33 | static int hex2sprom(u16 *sprom, const char *dump, size_t len, | 35 | static int hex2sprom(u16 *sprom, const char *dump, size_t len, |
34 | size_t sprom_size_words) | 36 | size_t sprom_size_words) |
35 | { | 37 | { |
36 | char tmp[5] = { 0 }; | 38 | char c, tmp[5] = { 0 }; |
37 | int cnt = 0; | 39 | int err, cnt = 0; |
38 | unsigned long parsed; | 40 | unsigned long parsed; |
39 | 41 | ||
40 | if (len < sprom_size_words * 2) | 42 | /* Strip whitespace at the end. */ |
43 | while (len) { | ||
44 | c = dump[len - 1]; | ||
45 | if (!isspace(c) && c != '\0') | ||
46 | break; | ||
47 | len--; | ||
48 | } | ||
49 | /* Length must match exactly. */ | ||
50 | if (len != sprom_size_words * 4) | ||
41 | return -EINVAL; | 51 | return -EINVAL; |
42 | 52 | ||
43 | while (cnt < sprom_size_words) { | 53 | while (cnt < sprom_size_words) { |
44 | memcpy(tmp, dump, 4); | 54 | memcpy(tmp, dump, 4); |
45 | dump += 4; | 55 | dump += 4; |
46 | parsed = simple_strtoul(tmp, NULL, 16); | 56 | err = strict_strtoul(tmp, 16, &parsed); |
57 | if (err) | ||
58 | return err; | ||
47 | sprom[cnt++] = swab16((u16)parsed); | 59 | sprom[cnt++] = swab16((u16)parsed); |
48 | } | 60 | } |
49 | 61 | ||