diff options
Diffstat (limited to 'ipc/msg.c')
-rw-r--r-- | ipc/msg.c | 13 |
1 files changed, 13 insertions, 0 deletions
@@ -695,6 +695,12 @@ long do_msgsnd(int msqid, long mtype, void __user *mtext, | |||
695 | if (ipcperms(ns, &msq->q_perm, S_IWUGO)) | 695 | if (ipcperms(ns, &msq->q_perm, S_IWUGO)) |
696 | goto out_unlock0; | 696 | goto out_unlock0; |
697 | 697 | ||
698 | /* raced with RMID? */ | ||
699 | if (msq->q_perm.deleted) { | ||
700 | err = -EIDRM; | ||
701 | goto out_unlock0; | ||
702 | } | ||
703 | |||
698 | err = security_msg_queue_msgsnd(msq, msg, msgflg); | 704 | err = security_msg_queue_msgsnd(msq, msg, msgflg); |
699 | if (err) | 705 | if (err) |
700 | goto out_unlock0; | 706 | goto out_unlock0; |
@@ -901,6 +907,13 @@ long do_msgrcv(int msqid, void __user *buf, size_t bufsz, long msgtyp, int msgfl | |||
901 | goto out_unlock1; | 907 | goto out_unlock1; |
902 | 908 | ||
903 | ipc_lock_object(&msq->q_perm); | 909 | ipc_lock_object(&msq->q_perm); |
910 | |||
911 | /* raced with RMID? */ | ||
912 | if (msq->q_perm.deleted) { | ||
913 | msg = ERR_PTR(-EIDRM); | ||
914 | goto out_unlock0; | ||
915 | } | ||
916 | |||
904 | msg = find_msg(msq, &msgtyp, mode); | 917 | msg = find_msg(msq, &msgtyp, mode); |
905 | if (!IS_ERR(msg)) { | 918 | if (!IS_ERR(msg)) { |
906 | /* | 919 | /* |