From bdc500a563ae661381b253835a30b52c172aacc8 Mon Sep 17 00:00:00 2001 From: "Dmitry V. Levin" Date: Fri, 17 Nov 2017 00:24:41 +0000 Subject: [PATCH] Update SHM_* constants * xlat/shm_flags.in: Add SHM_EXEC introduced by kernel commit v2.6.9-rc2~23^2~93^2~78. * xlat/shm_resource_flags.in: Add SHM_NORESERVE introduced by kernel commit v2.6.15-rc1~622. * NEWS: Mention this. * tests/ipc_shm.c (main): Update expected output. * tests/shmxt.c (main): Update expected output, check SHM_EXEC decoding. --- NEWS | 2 +- tests/ipc_shm.c | 6 ++++-- tests/shmxt.c | 25 +++++++++++++++++++------ xlat/shm_flags.in | 3 ++- xlat/shm_resource_flags.in | 1 + 5 files changed, 27 insertions(+), 10 deletions(-) diff --git a/NEWS b/NEWS index 87b85c7d..35d19773 100644 --- a/NEWS +++ b/NEWS @@ -5,7 +5,7 @@ Noteworthy changes in release ?.?? (????-??-??) * Implemented decoding of netlink descriptor attributes as file descriptors. * Enhanced decoding of getsockopt and setsockopt syscalls for SOL_NETLINK level. - * Updated the list of MSG_* constants. + * Updated lists of MSG_* and SHM_* constants. Noteworthy changes in release 4.20 (2017-11-13) =============================================== diff --git a/tests/ipc_shm.c b/tests/ipc_shm.c index 66960ff9..9e9c5609 100644 --- a/tests/ipc_shm.c +++ b/tests/ipc_shm.c @@ -70,12 +70,14 @@ main(void) struct shmid_ds ds; rc = shmget(bogus_key, bogus_size, bogus_flags); - printf("shmget\\(%#llx, %zu, %s%s%s%#x\\|%#04o\\) += %s\n", + printf("shmget\\(%#llx, %zu, %s%s%s%s%#x\\|%#04o\\) += %s\n", zero_extend_signed_to_ull(bogus_key), bogus_size, IPC_CREAT & bogus_flags ? "IPC_CREAT\\|" : "", IPC_EXCL & bogus_flags ? "IPC_EXCL\\|" : "", SHM_HUGETLB & bogus_flags ? "SHM_HUGETLB\\|" : "", - bogus_flags & ~(0777 | IPC_CREAT | IPC_EXCL | SHM_HUGETLB), + SHM_NORESERVE & bogus_flags ? "SHM_NORESERVE\\|" : "", + bogus_flags & ~(0777 | IPC_CREAT | IPC_EXCL + | SHM_HUGETLB | SHM_NORESERVE), bogus_flags & 0777, sprintrc_grep(rc)); id = shmget(private_key, 1, 0600); diff --git a/tests/shmxt.c b/tests/shmxt.c index 23cc7ccf..64312d43 100644 --- a/tests/shmxt.c +++ b/tests/shmxt.c @@ -34,8 +34,8 @@ main(void) atexit(cleanup); rc = (long) shmat(bogus_shmid, bogus_shmaddr, bogus_shmflg); - printf("%s(%d, %p, SHM_REMAP|SHM_RDONLY|SHM_RND|%#x) = %s\n", - SHMAT, bogus_shmid, bogus_shmaddr, bogus_shmflg & ~0x7000, + printf("%s(%d, %p, SHM_RDONLY|SHM_RND|SHM_REMAP|SHM_EXEC|%#x) = %s\n", + SHMAT, bogus_shmid, bogus_shmaddr, bogus_shmflg & ~0xf000, sprintrc(rc)); shmat(id, NULL, SHM_REMAP); @@ -50,18 +50,31 @@ main(void) rc = shmdt(NULL); printf("shmdt(NULL) = %s\n", sprintrc(rc)); - if (shmdt(shmaddr)) - perror_msg_and_skip("shmdt"); - printf("shmdt(%p) = 0\n", shmaddr); + rc = shmdt(shmaddr); + printf("shmdt(%p) = %s\n", shmaddr, sprintrc(rc)); ++shmaddr; void *shmaddr2 = shmat(id, shmaddr, SHM_RND); if (shmaddr2 == (void *)(-1)) printf("%s(%d, %p, SHM_RND) = -1 %s (%m)\n", SHMAT, id, shmaddr, errno2name()); - else + else { printf("%s(%d, %p, SHM_RND) = %p\n", SHMAT, id, shmaddr, shmaddr2); + rc = shmdt(shmaddr2); + printf("shmdt(%p) = %s\n", shmaddr2, sprintrc(rc)); + } + + shmaddr = shmat(id, NULL, SHM_RDONLY|SHM_EXEC); + if (shmaddr == (void *)(-1)) + printf("%s(%d, NULL, SHM_RDONLY|SHM_EXEC) = %s\n", + SHMAT, id, sprintrc(-1)); + else { + printf("%s(%d, NULL, SHM_RDONLY|SHM_EXEC) = %p\n", + SHMAT, id, shmaddr); + rc = shmdt(shmaddr); + printf("shmdt(%p) = %s\n", shmaddr, sprintrc(rc)); + } puts("+++ exited with 0 +++"); return 0; diff --git a/xlat/shm_flags.in b/xlat/shm_flags.in index a6206347..4432e719 100644 --- a/xlat/shm_flags.in +++ b/xlat/shm_flags.in @@ -1,3 +1,4 @@ -SHM_REMAP SHM_RDONLY SHM_RND +SHM_REMAP +SHM_EXEC diff --git a/xlat/shm_resource_flags.in b/xlat/shm_resource_flags.in index f3fc0dc4..1b07687e 100644 --- a/xlat/shm_resource_flags.in +++ b/xlat/shm_resource_flags.in @@ -1,3 +1,4 @@ IPC_CREAT IPC_EXCL SHM_HUGETLB +SHM_NORESERVE -- 2.40.0