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 */

Reply via email to