lib: fix strntol's end pointer when str has leading spaces
authorTomohiro Kusumi <kusumi.tomohiro@gmail.com>
Fri, 26 Oct 2018 16:35:45 +0000 (09:35 -0700)
committerJens Axboe <axboe@kernel.dk>
Fri, 26 Oct 2018 16:24:26 +0000 (10:24 -0600)
Fix unittests/lib/strntol.c test case failure.

Given behavior of strtol(3), "end" pointer should be calculated
based on "beg" pointer instead of "str" on success.

Otherwise if "str" has leading spaces (which are explicitly ignored
by strntol()), "end" won't point to "the first invalid character"
for not counting those spaces.

Glibc's strtol(3) says as follows.
--
 If endptr is not NULL, strtol() stores the address of the first
 invalid character in *endptr.  If there were no digits at all,
 strtol() stores the original value of nptr in *endptr (and returns 0).
 In particular, if *nptr is not '\0' but **endptr is '\0' on return,
 the entire string is valid.

Signed-off-by: Tomohiro Kusumi <kusumi.tomohiro@gmail.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
lib/strntol.c

index f622c8dc22cebd9d2504d794de028f203bfab265..c3a55a117801f56fbe39a40e9b09327968cbc3e0 100644 (file)
@@ -28,6 +28,6 @@ long strntol(const char *str, size_t sz, char **end, int base)
        if (ret == LONG_MIN || ret == LONG_MAX)
                return ret;
        if (end)
-               *end = (char *)str + (*end - buf);
+               *end = (char *)beg + (*end - buf);
        return ret;
 }