diff options
Diffstat (limited to 'net/sunrpc/cache.c')
-rw-r--r-- | net/sunrpc/cache.c | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/net/sunrpc/cache.c b/net/sunrpc/cache.c index 2a840519405..ac2c6e6abe6 100644 --- a/net/sunrpc/cache.c +++ b/net/sunrpc/cache.c | |||
@@ -1179,13 +1179,19 @@ int qword_get(char **bpp, char *dest, int bufsize) | |||
1179 | if (bp[0] == '\\' && bp[1] == 'x') { | 1179 | if (bp[0] == '\\' && bp[1] == 'x') { |
1180 | /* HEX STRING */ | 1180 | /* HEX STRING */ |
1181 | bp += 2; | 1181 | bp += 2; |
1182 | while (isxdigit(bp[0]) && isxdigit(bp[1]) && len < bufsize) { | 1182 | while (len < bufsize) { |
1183 | int byte = isdigit(*bp) ? *bp-'0' : toupper(*bp)-'A'+10; | 1183 | int h, l; |
1184 | bp++; | 1184 | |
1185 | byte <<= 4; | 1185 | h = hex_to_bin(bp[0]); |
1186 | byte |= isdigit(*bp) ? *bp-'0' : toupper(*bp)-'A'+10; | 1186 | if (h < 0) |
1187 | *dest++ = byte; | 1187 | break; |
1188 | bp++; | 1188 | |
1189 | l = hex_to_bin(bp[1]); | ||
1190 | if (l < 0) | ||
1191 | break; | ||
1192 | |||
1193 | *dest++ = (h << 4) | l; | ||
1194 | bp += 2; | ||
1189 | len++; | 1195 | len++; |
1190 | } | 1196 | } |
1191 | } else { | 1197 | } else { |