]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
selftests/mm: fix thread state check in uffd-unit-tests
authorWake Liu <wakel@google.com>
Wed, 10 Dec 2025 09:14:08 +0000 (17:14 +0800)
committerAndrew Morton <akpm@linux-foundation.org>
Tue, 23 Dec 2025 19:23:14 +0000 (11:23 -0800)
In the thread_state_get() function, the logic to find the thread's state
character was using `sizeof(header) - 1` to calculate the offset from the
"State:\t" string.

The `header` variable is a `const char *` pointer.  `sizeof()` on a
pointer returns the size of the pointer itself, not the length of the
string literal it points to.  This makes the code's behavior dependent on
the architecture's pointer size.

This bug was identified on a 32-bit ARM build (`gsi_tv_arm`) for Android,
running on an ARMv8-based device, compiled with Clang 19.0.1.

On this 32-bit architecture, `sizeof(char *)` is 4.  The expression
`sizeof(header) - 1` resulted in an incorrect offset of 3, causing the
test to read the wrong character from `/proc/[tid]/status` and fail.

On 64-bit architectures, `sizeof(char *)` is 8, so the expression
coincidentally evaluates to 7, which matches the length of "State:\t".
This is why the bug likely remained hidden on 64-bit builds.

To fix this and make the code portable and correct across all
architectures, this patch replaces `sizeof(header) - 1` with
`strlen(header)`.  The `strlen()` function correctly calculates the
string's length, ensuring the correct offset is always used.

Link: https://lkml.kernel.org/r/20251210091408.3781445-1-wakel@google.com
Fixes: f60b6634cd88 ("mm/selftests: add a test to verify mmap_changing race with -EAGAIN")
Signed-off-by: Wake Liu <wakel@google.com>
Acked-by: Peter Xu <peterx@redhat.com>
Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
Cc: Bill Wendling <morbo@google.com>
Cc: Justin Stitt <justinstitt@google.com>
Cc: Liam Howlett <liam.howlett@oracle.com>
Cc: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Nathan Chancellor <nathan@kernel.org>
Cc: Shuah Khan <shuah@kernel.org>
Cc: Suren Baghdasaryan <surenb@google.com>
Cc: Vlastimil Babka <vbabka@suse.cz>
Cc: <stable@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
tools/testing/selftests/mm/uffd-unit-tests.c

index f4807242c5b2b4cb78fa99be493c71306c6d1285..6f5e404a446c39387ab861bb692f5ae96009968b 100644 (file)
@@ -1317,7 +1317,7 @@ static thread_state thread_state_get(pid_t tid)
                p = strstr(tmp, header);
                if (p) {
                        /* For example, "State:\tD (disk sleep)" */
-                       c = *(p + sizeof(header) - 1);
+                       c = *(p + strlen(header));
                        return c == 'D' ?
                            THR_STATE_UNINTERRUPTIBLE : THR_STATE_UNKNOWN;
                }