From ab365f43e723c3742c0789c31d0ca4aeb3301aa4 Mon Sep 17 00:00:00 2001 From: Yang Xu Date: Wed, 9 Sep 2020 11:57:42 +0800 Subject: [PATCH] msgop.2: Add restriction on ENOSYS error When calling msgrcv() with the MSG_COPY flag, it will report EINVAL error even we if have disabled CONFIG_CHECKPOINT_RESTORE. ENOSYS will be reported only if we also specify the IPC_NOWAIT flag. [mtk: edited commit message] Notes from mtk: The relevant kernel code is this: [[ #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)); ... } ]] We'll only hit the ENOSYS error if: (1) MSG_COPY was specified; (2) IPC_NOWAIT was not specified; and (3) CONFIG_CHECKPOINT_RESTORE was not enabled. Signed-off-by: Yang Xu Signed-off-by: Michael Kerrisk --- 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