[LTP] [PATCH v2 2/2] Add shmat04 SysV IPC bug reproducer
Cyril Hrubis
chrubis@suse.cz
Mon Feb 26 17:06:03 CET 2024
Hi!
> +static void change_access(void *addr, int size, int prot)
> +{
> + switch (prot) {
> + case PROT_NONE:
> + tst_res(TINFO, "Disable memory access. addr: %p - size: %d",
> + addr, size);
> + break;
> + case PROT_WRITE:
> + tst_res(TINFO, "Enable write memory access. addr: %p - size: %d",
> + addr, size);
> + break;
> + default:
> + tst_res(TINFO, "Change memory access. addr: %p - size: %d",
> + addr, size);
> + break;
> + }
> +
> + SAFE_MPROTECT(addr, size, prot);
> +}
Hmm, it's kind of ugly how we wrap the macro here like that...
What about we instead add debugging messages to all the SAFE_MACROS()?
Given that we added TDEBUG flag recently we can do soemthing as:
tst_res_(TDEBUG, file, lineno, "mprotect(%p, %d, %s)",
addr, size, prot_to_str(prot));
To the SAFE_MPROTECT() and get the verbose output for free with verbose
flag passed to the test.
We can do that with all SAFE_MACROS() then we do not have to print most
of the messages in this test...
> +
> +static void run(void)
> +{
> + struct shmid_ds shmid_ds;
> + void *sh_mem;
> +
> + segment_id = SAFE_SHMGET(
> + key_id,
> + segment_size,
> + IPC_CREAT | IPC_EXCL | 0600);
> +
> + sh_mem = SAFE_SHMAT(segment_id, NULL, 0);
> +
> + tst_res(TINFO, "Attached at %p. key: %d - size: %lu",
> + sh_mem, segment_id, segment_size);
> +
> + SAFE_SHMCTL(segment_id, IPC_STAT, &shmid_ds);
> +
> + tst_res(TINFO, "Number of attaches: %lu", shmid_ds.shm_nattch);
> +
> + change_access(sh_mem + page_size, page_size, PROT_NONE);
> + change_access(sh_mem, 2 * page_size, PROT_WRITE);
> +
> + SAFE_SHMCTL(segment_id, IPC_STAT, &shmid_ds);
> +
> + tst_res(TINFO, "Number of attaches: %lu", shmid_ds.shm_nattch);
> + tst_res(TINFO, "Delete attached memory");
> +
> + SAFE_SHMDT(sh_mem);
> + SAFE_SHMCTL(segment_id, IPC_STAT, &shmid_ds);
> +
> + tst_res(TINFO, "Number of attaches: %lu", shmid_ds.shm_nattch);
> +
> + SAFE_SHMCTL(segment_id, IPC_RMID, NULL);
> + segment_id = -1;
> +
> + if (shmid_ds.shm_nattch)
> + tst_res(TFAIL, "The system is affected by the SysV IPC bug");
> + else
> + tst_res(TPASS, "Test passed");
These messages are not really that useful, we can as well do:
TST_EXP_EQ_LU(shmid_ds.shm_nattach, 0);
That will provide better message than "PASS: Test passed"
> +}
> +
> +static void setup(void)
> +{
> + key_id = GETIPCKEY();
> + page_size = getpagesize();
> +
> + tst_res(TINFO, "Key id: %d", key_id);
> + tst_res(TINFO, "Page size: %d", page_size);
> +
> + segment_size = 3 * page_size;
> +}
> +
> +static void cleanup(void)
> +{
> + if (segment_id != -1)
> + SAFE_SHMCTL(segment_id, IPC_RMID, NULL);
> +}
> +
> +static struct tst_test test = {
> + .test_all = run,
> + .setup = setup,
> + .cleanup = cleanup,
> +};
> --
> 2.35.3
>
>
> --
> Mailing list info: https://lists.linux.it/listinfo/ltp
--
Cyril Hrubis
chrubis@suse.cz
More information about the ltp
mailing list