Commit 621eb19ce1ec216e03ad354cb0c4061736b2a436
1 parent
2b4cf668a7
svcrpc: Revert "sunrpc/cache.h: replace simple_strtoul"
Commit bbf43dc888833ac0539e437dbaeb28bfd4fbab9f "sunrpc/cache.h: replace simple_strtoul" introduced new range-checking which could cause get_int to fail on unsigned integers too large to be represented as an int. We could parse them as unsigned instead--but it turns out svcgssd is actually passing down "-1" in some cases. Which is perhaps stupid, but there's nothing we can do about it now. So just revert back to the previous "sloppy" behavior that accepts either representation. Cc: stable@vger.kernel.org Reported-by: Sven Geggus <lists@fuchsschwanzdomain.de> Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Showing 1 changed file with 5 additions and 1 deletions Side-by-side Diff
include/linux/sunrpc/cache.h
... | ... | @@ -217,6 +217,8 @@ |
217 | 217 | static inline int get_int(char **bpp, int *anint) |
218 | 218 | { |
219 | 219 | char buf[50]; |
220 | + char *ep; | |
221 | + int rv; | |
220 | 222 | int len = qword_get(bpp, buf, sizeof(buf)); |
221 | 223 | |
222 | 224 | if (len < 0) |
223 | 225 | |
... | ... | @@ -224,9 +226,11 @@ |
224 | 226 | if (len == 0) |
225 | 227 | return -ENOENT; |
226 | 228 | |
227 | - if (kstrtoint(buf, 0, anint)) | |
229 | + rv = simple_strtol(buf, &ep, 0); | |
230 | + if (*ep) | |
228 | 231 | return -EINVAL; |
229 | 232 | |
233 | + *anint = rv; | |
230 | 234 | return 0; |
231 | 235 | } |
232 | 236 |