Module Name: src Committed By: rmind Date: Mon Jul 13 00:41:08 UTC 2009
Modified Files: src/sys/kern: sys_mqueue.c Log Message: mq_send/mq_receive: while permission may allow that, return EBADF if sending to read-only queue, or receiving from write-only queue. >From Stathis Kamperis, thanks! To generate a diff of this commit: cvs rdiff -u -r1.20 -r1.21 src/sys/kern/sys_mqueue.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/sys_mqueue.c diff -u src/sys/kern/sys_mqueue.c:1.20 src/sys/kern/sys_mqueue.c:1.21 --- src/sys/kern/sys_mqueue.c:1.20 Fri Jul 3 21:32:09 2009 +++ src/sys/kern/sys_mqueue.c Mon Jul 13 00:41:08 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: sys_mqueue.c,v 1.20 2009/07/03 21:32:09 elad Exp $ */ +/* $NetBSD: sys_mqueue.c,v 1.21 2009/07/13 00:41:08 rmind Exp $ */ /* * Copyright (c) 2007, 2008 Mindaugas Rasiukevicius <rmind at NetBSD org> @@ -42,7 +42,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sys_mqueue.c,v 1.20 2009/07/03 21:32:09 elad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sys_mqueue.c,v 1.21 2009/07/13 00:41:08 rmind Exp $"); #include <sys/param.h> #include <sys/types.h> @@ -351,7 +351,7 @@ kmem_free(name, MQ_NAMELEN); return EINVAL; } - + /* Check for mqueue attributes */ if (SCARG(uap, attr)) { error = copyin(SCARG(uap, attr), &attr, @@ -513,11 +513,16 @@ /* Get the message queue */ error = mqueue_get(mqdes, &fp); - if (error) + if (error) { return error; + } mq = fp->f_data; - + if ((fp->f_flag & FREAD) == 0) { + error = EBADF; + goto error; + } getnanotime(&mq->mq_atime); + /* Check the message size limits */ if (msg_len < mq->mq_attrib.mq_msgsize) { error = EMSGSIZE; @@ -679,7 +684,10 @@ return error; } mq = fp->f_data; - + if ((fp->f_flag & FWRITE) == 0) { + error = EBADF; + goto error; + } getnanotime(&mq->mq_mtime); /* Check the message size limit */