Hi Amit, On Tue, Dec 13, 2022 at 04:37:40PM +0530, Amit Daniel Kachhap wrote:
Musl and glibc syscall wrappers handles the null mq name in different ways and report different errors. Glibc reports error if the mq_name is not preceded by "/" character but musl does not treat this as an error.
Avoid the syscall wrapper by calling the syscall directly. This needs skipping the leading "/" character in mq_name as expected by the kernel.
Signed-off-by: Amit Daniel Kachhap amit.kachhap@arm.com
Changes in v3:
- Updated commit messages for musl and glibc as pointed by Beata.
testcases/kernel/syscalls/mq_open/mq_open01.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/testcases/kernel/syscalls/mq_open/mq_open01.c b/testcases/kernel/syscalls/mq_open/mq_open01.c index cd2a229d8..06858991e 100644 --- a/testcases/kernel/syscalls/mq_open/mq_open01.c +++ b/testcases/kernel/syscalls/mq_open/mq_open01.c @@ -14,6 +14,7 @@ #include "tst_test.h" #include "tst_safe_file_ops.h" #include "tst_safe_posix_ipc.h" +#include "lapi/syscalls.h" #define QUEUE_NAME "/test_mqueue" #define QUEUE_INIT "/init_mqueue" @@ -95,7 +96,7 @@ static struct test_case tcase[] = { .qname = "", .oflag = O_CREAT, .ret = -1,
.err = EINVAL,
}, { .desc = "NORMAL",.err = ENOENT,
@@ -228,7 +229,10 @@ static void do_test(unsigned int i) if (tc->setup) tc->setup();
- TEST(fd = mq_open(qname, tc->oflag, S_IRWXU, tc->rq));
- if (*qname == '/')
TEST(fd = tst_syscall(__NR_mq_open, qname + 1, tc->oflag, S_IRWXU, tc->rq));
- else
TEST(fd = tst_syscall(__NR_mq_open, qname, tc->oflag, S_IRWXU, tc->rq));
Overall the change looks good though I have been thinking if there is a way to handle that with maintaining call to libc handler regardless of which libc is being used. The reason is that libc's mq_open is not just a simple wrappper for the syscall and it seems that overall (upstream) preferred approach, is to maintain the libc handler in such cases, but leave it to the test to handle potentially different outcomes. So it's more of me testing the waters here, but maybe adding an alternate err to test descriptor and checking against that would do the trick ? so we would have then: .err = EINVAL, .alt_err = ENOENT /* Comment here on Musl's implementation */
and then:
if (TST_ERR != tc->err) { if ((TST_ERR != tc->alt_err) { tst_res(TFAIL | TTERRNO, "%s expected errno: %d", ... goto CLEANUP; } }
What do you think ?
--- BR B.
if (fd > 0 && tc->rq) { if (mq_getattr(fd, &oldattr) < 0) { -- 2.25.1
linux-morello-ltp mailing list -- linux-morello-ltp@op-lists.linaro.org To unsubscribe send an email to linux-morello-ltp-leave@op-lists.linaro.org