[LTP] LTP syscalls mseal02 and shmctl03 fails on compat mode 64-bit kernel on 32-bit rootfs

Arnd Bergmann arnd@arndb.de
Thu Jul 3 16:17:37 CEST 2025


On Thu, Jul 3, 2025, at 15:47, Naresh Kamboju wrote:
> The LTP syscalls mseal02 and shmctl03 failed only with compat mode testing
> with 64-bit kernel with 32-bit rootfs combination.
>
> Would it be possible to detect compat mode test environment and handle the test
> expectation in LTP test development ?

I think we should either make the kernel behave the same way in
both environments, or accept either behavior as correct in LTP.
NVAL (22)
> mseal02.c:45: TPASS: mseal(0xf7a8e001, 4096, 0) : EINVAL (22)
> mseal02.c:45: TFAIL: mseal(0xf7a8e000, 4294963201, 0) expected EINVAL:
> ENOMEM (12)

This is "length=ULONG_MAX-page_size+2", which overflows on 32-bit
but not on 64-bit.

How about this?

--- a/mm/mseal.c
+++ b/mm/mseal.c
@@ -234,6 +234,9 @@ int do_mseal(unsigned long start, size_t len_in, unsigned long flags)
        if (end < start)
                return -EINVAL;
 
+       if (end > TASK_SIZE)
+               return -EINVAL;
+
        if (end == start)
                return 0;
 
Since TASK_SIZE is smaller for 32-bit tasks, it would detect
the overflow in the same way.

> tst_test.c:1774: TINFO: Overall timeout per run is 0h 21m 36s
> shmctl03.c:31: TPASS: shmmin = 1
> shmctl03.c:33: TFAIL: /proc/sys/kernel/shmmax != 2147483647 got 4294967295

I see this is being intentionally truncated to INT_MAX:

static int copy_compat_shminfo_to_user(void __user *buf, struct shminfo64 *in,
                                        int version)
{
        if (in->shmmax > INT_MAX)
                in->shmmax = INT_MAX;
        ...
}

> shmctl03.c:35: TFAIL: /proc/sys/kernel/shmall != 4278190079 got 4294967295

Here the value from /proc is defined in the kernel as
"#define SHMALL (ULONG_MAX - (1UL << 24))"

On a 64-bit machine this is 0xfffffffffeffffff.

However the 32-bit ltp tst_assert_ulong() truncates it
to 0xfeffffff, which happens to be the exact same value
that it would see on a 32-bit kernel.

The second one is 0xffffffff, and I don't know how that gets
computed, as it is derived from the same number in
info.shmall = in->shmall;

Are you running this inside of a container that its own ipc
namespace?

     Arnd


More information about the ltp mailing list