Re: [PATCH] msgop.2: Add restriction on ENOSYS error

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello Yang Xu,

On Wed, 9 Sep 2020 at 05:57, Yang Xu <xuyang2018.jy@xxxxxxxxxxxxxx> wrote:
>
> When calling msgrcv with MSG_COPY flag on 3.8 or new kernel, it will
> report EINVAL error even we have disabled CONFIG_CHECKPOINT_RESTORE.
> It also needs to specify IPC_NOWAIT flag.
>
> Signed-off-by: Yang Xu <xuyang2018.jy@xxxxxxxxxxxxxx>
> ---
>  man2/msgop.2 | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/man2/msgop.2 b/man2/msgop.2
> index 373e53aa7..e559097a7 100644
> --- a/man2/msgop.2
> +++ b/man2/msgop.2
> @@ -467,7 +467,9 @@ and the queue contains less than
>  messages.
>  .TP
>  .BR ENOSYS " (since Linux 3.8)"
> -.I MSG_COPY
> +.B IPC_NOWAIT
> +and
> +.B MSG_COPY
>  was specified in
>  .IR msgflg ,
>  and this kernel was configured without
> --
> 2.23.0

My apologies, I have a little bit of trouble to understand your commit
message, but the patch does seem to be wrong, at least as I understand
the code:

[[
#ifdef CONFIG_CHECKPOINT_RESTORE
...
#else
static inline struct msg_msg *prepare_copy(void __user *buf, size_t bufsz)
{
        return ERR_PTR(-ENOSYS);
}

...
static long do_msgrcv(int msqid, void __user *buf, size_t bufsz, long
msgtyp, int msgflg,
               long (*msg_handler)(void __user *, struct msg_msg *, size_t))
{
...
        if (msgflg & MSG_COPY) {
                if ((msgflg & MSG_EXCEPT) || !(msgflg & IPC_NOWAIT))
                        return -EINVAL;
                copy = prepare_copy(buf, min_t(size_t, bufsz, ns->msg_ctlmax));
...
}
]]

My reading of that code is:
if MSG_COPY && MSG_EXCEPT ==> EINVAL
if MSG_COPY && ! IPC_NOWAIT ==> EINVAL
if neither of the above: if MSG_COPY && ! CONFIG_CHECKPOINT_RESTORE ==> ENOSYS

And all of that seems already to be captured in the manual page:

       EINVAL (since Linux 3.14)
              msgflg specified MSG_COPY, but not IPC_NOWAIT.

       EINVAL (since Linux 3.14)
              msgflg specified both MSG_COPY and MSG_EXCEPT.

       ENOSYS (since Linux 3.8)
              MSG_COPY was specified in msgflg, and this kernel was  con‐
              figured without CONFIG_CHECKPOINT_RESTORE.

Have I missed something?

Thanks,

Michael

-- 
Michael Kerrisk
Linux man-pages maintainer; http://www.kernel.org/doc/man-pages/
Linux/UNIX System Programming Training: http://man7.org/training/




[Index of Archives]     [Kernel Documentation]     [Netdev]     [Linux Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux