commit eb08151b8d0916678d3a59d84d0c969279b601b8
Author: Amon Ott <ao@rsbac.org>
Date:   Wed Nov 30 09:18:12 2011 +0100

    Fix open mode detection.

diff --git a/fs/namei.c b/fs/namei.c
index 3a6e1d8..99bb3c0 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -1891,18 +1891,16 @@ static struct file *finish_open(struct nameidata *nd,
 	if (open_flag & O_APPEND)
 		rsbac_adf_req = R_APPEND_OPEN;
 	else
-		if ((open_flag & FMODE_WRITE) && (open_flag & FMODE_READ))
+		if ((open_flag & O_RDWR) || ((open_flag & O_WRONLY) && (open_flag & O_RDONLY)))
 			rsbac_adf_req = R_READ_WRITE_OPEN;
 		else
-			if (open_flag & FMODE_WRITE)
+			if (open_flag & O_WRONLY)
 				rsbac_adf_req = R_WRITE_OPEN;
 			else
-				if (open_flag & FMODE_READ) {
-					if (rsbac_target == T_DIR)
-						rsbac_adf_req = R_READ;
-					else
-						rsbac_adf_req = R_READ_OPEN;
-				}
+				if (rsbac_target == T_DIR)
+					rsbac_adf_req = R_READ;
+				else
+					rsbac_adf_req = R_READ_OPEN;
 	if ((rsbac_adf_req != R_NONE) && (rsbac_target != T_NONE)) {
 		rsbac_attribute_value.open_flag = open_flag;
 		if (!rsbac_adf_request(rsbac_adf_req,
@@ -1944,7 +1942,7 @@ static struct file *finish_open(struct nameidata *nd,
 	}
 
 #ifdef CONFIG_RSBAC
-	if ((rsbac_adf_req != R_NONE) && (rsbac_target != T_NONE)) {
+	if (!PTR_ERR(filp) && (rsbac_adf_req != R_NONE) && (rsbac_target != T_NONE)) {
 		rsbac_new_target_id.dummy = 0;
 		if (rsbac_adf_set_attr(rsbac_adf_req,
 					task_pid(current),
