misc/167302: mfiutil doesn't allow RO access to RO attributes for device

markham breitbach markham at ssimicro.com
Wed Apr 25 21:10:11 UTC 2012


>Number:         167302
>Category:       misc
>Synopsis:       mfiutil doesn't allow RO access to RO attributes for device
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Wed Apr 25 21:10:10 UTC 2012
>Closed-Date:
>Last-Modified:
>Originator:     markham breitbach
>Release:        8.1-RELEASE
>Organization:
SSi Micro
>Environment:
FreeBSD jellybean.ssimicro.com 8.1-RELEASE-p5 FreeBSD 8.1-RELEASE-p5 #0: Tue Sep 27 16:18:26 UTC 2011     root at i386-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC  i386
>Description:
Currently mfiutil is only really useful to run as root beacuse all access to the device is RDWR.  This patch allows users with RO privilege to the device to read the RO attributes (mostly SHOW commands).  This is useful, for example for a nagios or other monitoring system.
>How-To-Repeat:

>Fix:
created patch for usr.src/mfiutil.

Patch attached with submission follows:

diff -rupN /tmp/mfiutil/mfi_cmd.c ./mfi_cmd.c
--- /tmp/mfiutil/mfi_cmd.c	2012-04-25 20:50:18.000000000 +0000
+++ ./mfi_cmd.c	2012-04-25 20:22:10.000000000 +0000
@@ -301,12 +301,12 @@ mfi_ctrl_get_info(int fd, struct mfi_ctr
 }
 
 int
-mfi_open(int unit)
+mfi_open(int unit,int access)
 {
 	char path[MAXPATHLEN];
 
 	snprintf(path, sizeof(path), "/dev/mfi%d", unit);
-	return (open(path, O_RDWR));
+	return (open(path, access));
 }
 
 void
diff -rupN /tmp/mfiutil/mfi_config.c ./mfi_config.c
--- /tmp/mfiutil/mfi_config.c	2010-06-14 02:09:06.000000000 +0000
+++ ./mfi_config.c	2012-04-25 20:33:15.000000000 +0000
@@ -43,6 +43,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#include <fcntl.h>
 #include "mfiutil.h"
 
 #ifdef DEBUG
@@ -154,7 +155,7 @@ clear_config(int ac, char **av)
 	int ch, fd;
 	u_int i;
 
-	fd = mfi_open(mfi_unit);
+	fd = mfi_open(mfi_unit,O_RDWR);
 	if (fd < 0) {
 		warn("mfi_open");
 		return (errno);
@@ -546,7 +547,7 @@ create_volume(int ac, char **av)
 	}
 
 	
-	fd = mfi_open(mfi_unit);
+	fd = mfi_open(mfi_unit,O_RDWR);
 	if (fd < 0) {
 		warn("mfi_open");
 		return (errno);
@@ -797,7 +798,7 @@ delete_volume(int ac, char **av)
 		return (EINVAL);
 	}
 
-	fd = mfi_open(mfi_unit);
+	fd = mfi_open(mfi_unit,O_RDWR);
 	if (fd < 0) {
 		warn("mfi_open");
 		return (errno);
@@ -856,7 +857,7 @@ add_spare(int ac, char **av)
 		return (EINVAL);
 	}
 
-	fd = mfi_open(mfi_unit);
+	fd = mfi_open(mfi_unit,O_RDWR);
 	if (fd < 0) {
 		warn("mfi_open");
 		return (errno);
@@ -962,7 +963,7 @@ remove_spare(int ac, char **av)
 		return (EINVAL);
 	}
 
-	fd = mfi_open(mfi_unit);
+	fd = mfi_open(mfi_unit,O_RDWR);
 	if (fd < 0) {
 		warn("mfi_open");
 		return (errno);
@@ -1100,7 +1101,7 @@ debug_config(int ac, char **av)
 		return (EINVAL);
 	}
 
-	fd = mfi_open(mfi_unit);
+	fd = mfi_open(mfi_unit,O_RDWR);
 	if (fd < 0) {
 		warn("mfi_open");
 		return (errno);
@@ -1134,7 +1135,7 @@ dump(int ac, char **av)
 		return (EINVAL);
 	}
 
-	fd = mfi_open(mfi_unit);
+	fd = mfi_open(mfi_unit,O_RDWR);
 	if (fd < 0) {
 		warn("mfi_open");
 		return (errno);
diff -rupN /tmp/mfiutil/mfi_drive.c ./mfi_drive.c
--- /tmp/mfiutil/mfi_drive.c	2010-06-14 02:09:06.000000000 +0000
+++ ./mfi_drive.c	2012-04-25 20:33:38.000000000 +0000
@@ -40,6 +40,7 @@
 #include <string.h>
 #include <strings.h>
 #include <unistd.h>
+#include <fcntl.h>
 #include <cam/scsi/scsi_all.h>
 #include "mfiutil.h"
 
@@ -296,7 +297,7 @@ drive_set_state(char *drive, uint16_t ne
 	uint8_t mbox[6];
 	int error, fd;
 
-	fd = mfi_open(mfi_unit);
+	fd = mfi_open(mfi_unit,O_RDWR);
 	if (fd < 0) {
 		warn("mfi_open");
 		return (errno);
@@ -389,7 +390,7 @@ start_rebuild(int ac, char **av)
 		return (EINVAL);
 	}
 
-	fd = mfi_open(mfi_unit);
+	fd = mfi_open(mfi_unit,O_RDWR);
 	if (fd < 0) {
 		warn("mfi_open");
 		return (errno);
@@ -438,7 +439,7 @@ abort_rebuild(int ac, char **av)
 		return (EINVAL);
 	}
 
-	fd = mfi_open(mfi_unit);
+	fd = mfi_open(mfi_unit,O_RDWR);
 	if (fd < 0) {
 		warn("mfi_open");
 		return (errno);
@@ -486,7 +487,7 @@ drive_progress(int ac, char **av)
 		return (EINVAL);
 	}
 
-	fd = mfi_open(mfi_unit);
+	fd = mfi_open(mfi_unit,O_RDWR);
 	if (fd < 0) {
 		warn("mfi_open");
 		return (errno);
@@ -545,7 +546,7 @@ drive_clear(int ac, char **av)
 		return (EINVAL);
 	}
 
-	fd = mfi_open(mfi_unit);
+	fd = mfi_open(mfi_unit,O_RDWR);
 	if (fd < 0) {
 		warn("mfi_open");
 		return (errno);
@@ -598,7 +599,7 @@ drive_locate(int ac, char **av)
 		return (EINVAL);
 	}
 
-	fd = mfi_open(mfi_unit);
+	fd = mfi_open(mfi_unit,O_RDWR);
 	if (fd < 0) {
 		warn("mfi_open");
 		return (errno);
diff -rupN /tmp/mfiutil/mfi_evt.c ./mfi_evt.c
--- /tmp/mfiutil/mfi_evt.c	2010-06-14 02:09:06.000000000 +0000
+++ ./mfi_evt.c	2012-04-25 20:34:08.000000000 +0000
@@ -38,6 +38,7 @@
 #include <strings.h>
 #include <time.h>
 #include <unistd.h>
+#include <fcntl.h>
 #include "mfiutil.h"
 
 static int
@@ -74,7 +75,7 @@ show_logstate(int ac, char **av)
 		return (EINVAL);
 	}
 
-	fd = mfi_open(mfi_unit);
+	fd = mfi_open(mfi_unit,O_RDWR);
 	if (fd < 0) {
 		warn("mfi_open");
 		return (errno);
@@ -539,7 +540,7 @@ show_events(int ac, char **av)
 	int ch, fd, num_events, verbose;
 	u_int i;
 
-	fd = mfi_open(mfi_unit);
+	fd = mfi_open(mfi_unit,O_RDWR);
 	if (fd < 0) {
 		warn("mfi_open");
 		return (errno);
diff -rupN /tmp/mfiutil/mfi_flash.c ./mfi_flash.c
--- /tmp/mfiutil/mfi_flash.c	2010-06-14 02:09:06.000000000 +0000
+++ ./mfi_flash.c	2012-04-25 20:34:53.000000000 +0000
@@ -38,6 +38,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#include <fcntl.h>
 #include "mfiutil.h"
 
 #define	FLASH_BUF_SIZE	(64 * 1024)
@@ -140,7 +141,7 @@ flash_adapter(int ac, char **av)
 		return (EINVAL);
 	}
 
-	fd = mfi_open(mfi_unit);
+	fd = mfi_open(mfi_unit,O_RDWR);
 	if (fd < 0) {
 		warn("mfi_open");
 		return (errno);
diff -rupN /tmp/mfiutil/mfi_patrol.c ./mfi_patrol.c
--- /tmp/mfiutil/mfi_patrol.c	2010-06-14 02:09:06.000000000 +0000
+++ ./mfi_patrol.c	2012-04-25 20:35:16.000000000 +0000
@@ -37,6 +37,7 @@
 #include <string.h>
 #include <time.h>
 #include <unistd.h>
+#include <fcntl.h>
 #include "mfiutil.h"
 
 static char *
@@ -84,7 +85,7 @@ show_patrol(int ac, char **av)
 	int fd;
 	u_int i;
 
-	fd = mfi_open(mfi_unit);
+	fd = mfi_open(mfi_unit,O_RDWR);
 	if (fd < 0) {
 		warn("mfi_open");
 		return (errno);
@@ -180,7 +181,7 @@ start_patrol(int ac, char **av)
 {
 	int fd;
 
-	fd = mfi_open(mfi_unit);
+	fd = mfi_open(mfi_unit,O_RDWR);
 	if (fd < 0) {
 		warn("mfi_open");
 		return (errno);
@@ -203,7 +204,7 @@ stop_patrol(int ac, char **av)
 {
 	int fd;
 
-	fd = mfi_open(mfi_unit);
+	fd = mfi_open(mfi_unit,O_RDWR);
 	if (fd < 0) {
 		warn("mfi_open");
 		return (errno);
@@ -270,7 +271,7 @@ patrol_config(int ac, char **av)
 		return (EINVAL);
 	}
 
-	fd = mfi_open(mfi_unit);
+	fd = mfi_open(mfi_unit,O_RDWR);
 	if (fd < 0) {
 		warn("mfi_open");
 		return (errno);
diff -rupN /tmp/mfiutil/mfi_show.c ./mfi_show.c
--- /tmp/mfiutil/mfi_show.c	2010-06-14 02:09:06.000000000 +0000
+++ ./mfi_show.c	2012-04-25 20:30:29.000000000 +0000
@@ -37,6 +37,9 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+
 #include "mfiutil.h"
 
 MFI_TABLE(top, show);
@@ -61,7 +64,7 @@ show_adapter(int ac, char **av)
 		return (EINVAL);
 	}
 
-	fd = mfi_open(mfi_unit);
+	fd = mfi_open(mfi_unit,O_RDONLY);
 	if (fd < 0) {
 		warn("mfi_open");
 		return (errno);
@@ -144,7 +147,7 @@ show_battery(int ac, char **av)
 		return (EINVAL);
 	}
 
-	fd = mfi_open(mfi_unit);
+	fd = mfi_open(mfi_unit,O_RDONLY);
 	if (fd < 0) {
 		warn("mfi_open");
 		return (errno);
@@ -249,7 +252,7 @@ show_config(int ac, char **av)
 		return (EINVAL);
 	}
 
-	fd = mfi_open(mfi_unit);
+	fd = mfi_open(mfi_unit,O_RDONLY);
 	if (fd < 0) {
 		warn("mfi_open");
 		return (errno);
@@ -345,7 +348,7 @@ show_volumes(int ac, char **av)
 		return (EINVAL);
 	}
 
-	fd = mfi_open(mfi_unit);
+	fd = mfi_open(mfi_unit,O_RDONLY);
 	if (fd < 0) {
 		warn("mfi_open");
 		return (errno);
@@ -423,7 +426,7 @@ show_drives(int ac, char **av)
 		return (EINVAL);
 	}
 
-	fd = mfi_open(mfi_unit);
+	fd = mfi_open(mfi_unit,O_RDONLY);
 	if (fd < 0) {
 		warn("mfi_open");
 		return (errno);
@@ -519,7 +522,7 @@ show_firmware(int ac, char **av)
 		return (EINVAL);
 	}
 
-	fd = mfi_open(mfi_unit);
+	fd = mfi_open(mfi_unit,O_RDONLY);
 	if (fd < 0) {
 		warn("mfi_open");
 		return (errno);
diff -rupN /tmp/mfiutil/mfi_volume.c ./mfi_volume.c
--- /tmp/mfiutil/mfi_volume.c	2010-06-14 02:09:06.000000000 +0000
+++ ./mfi_volume.c	2012-04-25 20:39:28.000000000 +0000
@@ -37,6 +37,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#include <fcntl.h>
 #include "mfiutil.h"
 
 MFI_TABLE(top, volume);
@@ -158,7 +159,7 @@ volume_cache(int ac, char **av)
 		return (EINVAL);
 	}
 
-	fd = mfi_open(mfi_unit);
+	fd = mfi_open(mfi_unit,O_RDWR);
 	if (fd < 0) {
 		warn("mfi_open");
 		return (errno);
@@ -330,7 +331,7 @@ volume_name(int ac, char **av)
 		return (ENOSPC);
 	}
 
-	fd = mfi_open(mfi_unit);
+	fd = mfi_open(mfi_unit,O_RDWR);
 	if (fd < 0) {
 		warn("mfi_open");
 		return (errno);
@@ -374,7 +375,7 @@ volume_progress(int ac, char **av)
 		return (EINVAL);
 	}
 
-	fd = mfi_open(mfi_unit);
+	fd = mfi_open(mfi_unit,O_RDONLY);
 	if (fd < 0) {
 		warn("mfi_open");
 		return (errno);
diff -rupN /tmp/mfiutil/mfiutil.c ./mfiutil.c
--- /tmp/mfiutil/mfiutil.c	2010-06-14 02:09:06.000000000 +0000
+++ ./mfiutil.c	2012-04-25 20:41:16.000000000 +0000
@@ -91,7 +91,7 @@ static int
 version(int ac, char **av)
 {
 
-	printf("mfiutil version 1.0.13");
+	printf("mfiutil version 1.0.13b");
 #ifdef DEBUG
 	printf(" (DEBUG)");
 #endif
diff -rupN /tmp/mfiutil/mfiutil.h ./mfiutil.h
--- /tmp/mfiutil/mfiutil.h	2010-06-14 02:09:06.000000000 +0000
+++ ./mfiutil.h	2012-04-25 20:21:30.000000000 +0000
@@ -133,7 +133,7 @@ int	mfi_lookup_drive(int fd, char *drive
 int	mfi_lookup_volume(int fd, const char *name, uint8_t *target_id);
 int	mfi_dcmd_command(int fd, uint32_t opcode, void *buf, size_t bufsize,
     uint8_t *mbox, size_t mboxlen, uint8_t *statusp);
-int	mfi_open(int unit);
+int	mfi_open(int unit,int access);
 int	mfi_ctrl_get_info(int fd, struct mfi_ctrl_info *info, uint8_t *statusp);
 int	mfi_ld_get_info(int fd, uint8_t target_id, struct mfi_ld_info *info,
     uint8_t *statusp);


>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-bugs mailing list