[LTP] [PATCH v2] syscalls/msgrcv03: Add error test for MSG_COPY flag
Yang Xu
xuyang2018.jy@cn.fujitsu.com
Fri Sep 4 05:47:01 CEST 2020
Hi
Ping.
> Hi Cyril
>
> Do you have some comments for this v2 patch?
>
> Best Regards
> Yang Xu
>> The MSG_COPY flag was added in 3.8 for the implementation of the kernel
>> checkpoint-restore facility and is available only if the kernel was
>> built with the CONFIG_CHECKPOINT_RESTORE option.
>>
>> On old kernel without this support, it only ignores this flag and doesn't
>> report ENOSYS/EINVAL error, so I add kconfig and min_kver check.
>>
>> Signed-off-by: Yang Xu <xuyang2018.jy@cn.fujitsu.com>
>> ---
>> v1->v2:
>> 1.Rename msgrcv09->msgrcv03
>> 2.add comment on top level for why we both need min_kernel and kconfig
>> check
>> include/lapi/msg.h | 15 +++
>> runtest/syscalls | 1 +
>> runtest/syscalls-ipc | 1 +
>> .../kernel/syscalls/ipc/msgrcv/.gitignore | 1 +
>> .../kernel/syscalls/ipc/msgrcv/msgrcv03.c | 102 ++++++++++++++++++
>> 5 files changed, 120 insertions(+)
>> create mode 100644 include/lapi/msg.h
>> create mode 100644 testcases/kernel/syscalls/ipc/msgrcv/msgrcv03.c
>>
>> diff --git a/include/lapi/msg.h b/include/lapi/msg.h
>> new file mode 100644
>> index 000000000..d649f3318
>> --- /dev/null
>> +++ b/include/lapi/msg.h
>> @@ -0,0 +1,15 @@
>> +// SPDX-License-Identifier: GPL-2.0-or-later
>> +/*
>> + * Copyright (c) 2020 FUJITSU LIMITED. All rights reserved.
>> + * Author: Yang Xu <xuyang2018.jy@cn.fujitsu.com>
>> + */
>> +#ifndef LAPI_MSG_H
>> +#define LAPI_MSG_H
>> +
>> +#include <sys/msg.h>
>> +
>> +#ifndef MSG_COPY
>> +# define MSG_COPY 040000 /* copy (not remove) all queue messages */
>> +#endif
>> +
>> +#endif
>> diff --git a/runtest/syscalls b/runtest/syscalls
>> index 860c5c36d..20bbc022b 100644
>> --- a/runtest/syscalls
>> +++ b/runtest/syscalls
>> @@ -815,6 +815,7 @@ msgget05 msgget05
>> msgrcv01 msgrcv01
>> msgrcv02 msgrcv02
>> +msgrcv03 msgrcv03
>> msgrcv05 msgrcv05
>> msgrcv06 msgrcv06
>> msgrcv07 msgrcv07
>> diff --git a/runtest/syscalls-ipc b/runtest/syscalls-ipc
>> index e6837414c..94d1e4001 100644
>> --- a/runtest/syscalls-ipc
>> +++ b/runtest/syscalls-ipc
>> @@ -17,6 +17,7 @@ msgget05 msgget05
>> msgrcv01 msgrcv01
>> msgrcv02 msgrcv02
>> +msgrcv03 msgrcv03
>> msgrcv05 msgrcv05
>> msgrcv06 msgrcv06
>> msgrcv07 msgrcv07
>> diff --git a/testcases/kernel/syscalls/ipc/msgrcv/.gitignore
>> b/testcases/kernel/syscalls/ipc/msgrcv/.gitignore
>> index 0596ee00f..8ab91e763 100644
>> --- a/testcases/kernel/syscalls/ipc/msgrcv/.gitignore
>> +++ b/testcases/kernel/syscalls/ipc/msgrcv/.gitignore
>> @@ -1,5 +1,6 @@
>> /msgrcv01
>> /msgrcv02
>> +/msgrcv03
>> /msgrcv05
>> /msgrcv06
>> /msgrcv07
>> diff --git a/testcases/kernel/syscalls/ipc/msgrcv/msgrcv03.c
>> b/testcases/kernel/syscalls/ipc/msgrcv/msgrcv03.c
>> new file mode 100644
>> index 000000000..84456c1cf
>> --- /dev/null
>> +++ b/testcases/kernel/syscalls/ipc/msgrcv/msgrcv03.c
>> @@ -0,0 +1,102 @@
>> +// SPDX-License-Identifier: GPL-2.0-or-later
>> +/*
>> + * Copyright (c) 2020 FUJITSU LIMITED. All rights reserved.
>> + * Author: Yang Xu <xuyang2018.jy@cn.jujitsu.com>
>> + *
>> + * This is a basic test about MSG_COPY flag.
>> + * This flag was added in 3.8 for the implementation of the kernel
>> checkpoint
>> + * restore facility and is available only if the kernel was built
>> with the
>> + * CONFIG_CHECKPOINT_RESTORE option.
>> + * On old kernel without this support, it only ignores this flag and
>> doesn't
>> + * report ENOSYS/EINVAL error. The CONFIG_CHECKPOINT_RESTORE has existed
>> + * before kernel 3.8.
>> + * So for using this flag, kernel should greater than 3.8 and enable
>> + * CONFIG_CHECKPOINT_RESTORE together.
>> + *
>> + * 1)msgrcv(2) fails and sets errno to EINVAL if IPC_NOWAIT was not
>> specified
>> + * in msgflag.
>> + * 2)msgrcv(2) fails and sets errno to EINVAL if IPC_EXCEPT was
>> specified
>> + * in msgflag.
>> + * 3)msgrcv(2) fails and set errno to ENOMSG if IPC_NOWAIT and
>> MSG_COPY were
>> + * specified in msgflg and the queue contains less than msgtyp
>> messages.
>> + */
>> +
>> +#define _GNU_SOURCE
>> +#include <string.h>
>> +#include <sys/wait.h>
>> +#include <sys/msg.h>
>> +#include <pwd.h>
>> +#include "tst_test.h"
>> +#include "tst_safe_sysv_ipc.h"
>> +#include "libnewipc.h"
>> +#include "lapi/msg.h"
>> +
>> +static key_t msgkey;
>> +static int queue_id = -1;
>> +static struct buf {
>> + long type;
>> + char mtext[MSGSIZE];
>> +} rcv_buf, snd_buf = {MSGTYPE, "hello"};
>> +
>> +static struct tcase {
>> + int exp_err;
>> + int msg_flag;
>> + int msg_type;
>> + char *message;
>> +} tcases[] = {
>> + {EINVAL, 0, MSGTYPE,
>> + "Test EINVAL error when msgflg specified MSG_COPY, but not
>> IPC_NOWAIT"},
>> +
>> + {EINVAL, MSG_EXCEPT, MSGTYPE,
>> + "Test EINVAL error when msgflg specified both MSG_COPY and
>> MSG_EXCEPT"},
>> +
>> + {ENOMSG, IPC_NOWAIT, 2,
>> + "Test ENOMSG error when using IPC_NOWAIT and MSG_COPY but not have"
>> + " corresponding msgtype msg"},
>> +};
>> +
>> +static void verify_msgrcv(unsigned int n)
>> +{
>> + struct tcase *tc = &tcases[n];
>> +
>> + tst_res(TINFO, "%s", tc->message);
>> + TEST(msgrcv(queue_id, &rcv_buf, MSGSIZE, tc->msg_type, MSG_COPY |
>> tc->msg_flag));
>> + if (TST_RET != -1) {
>> + tst_res(TFAIL, "msgrcv() succeeded unexpectedly");
>> + SAFE_MSGSND(queue_id, &snd_buf, MSGSIZE, 0);
>> + return;
>> + }
>> +
>> + if (TST_ERR == tc->exp_err)
>> + tst_res(TPASS | TTERRNO, "msgrcv() failed as expected");
>> + else
>> + tst_res(TFAIL | TTERRNO, "msgrcv() failed unexpectedly,"
>> + " expected %s but got", tst_strerrno(tc->exp_err));
>> +}
>> +
>> +static void setup(void)
>> +{
>> + msgkey = GETIPCKEY();
>> + queue_id = SAFE_MSGGET(msgkey, IPC_CREAT | IPC_EXCL | MSG_RW);
>> + SAFE_MSGSND(queue_id, &snd_buf, MSGSIZE, 0);
>> +}
>> +
>> +static void cleanup(void)
>> +{
>> + if (queue_id != -1)
>> + SAFE_MSGCTL(queue_id, IPC_RMID, NULL);
>> +}
>> +
>> +static struct tst_test test = {
>> + .needs_tmpdir = 1,
>> + .needs_root = 1,
>> + .needs_kconfigs = (const char *[]) {
>> + "CONFIG_CHECKPOINT_RESTORE",
>> + NULL
>> + },
>> + .min_kver = "3.8.0",
>> + .tcnt = ARRAY_SIZE(tcases),
>> + .test = verify_msgrcv,
>> + .setup = setup,
>> + .cleanup = cleanup,
>> +};
>>
>
>
>
More information about the ltp
mailing list