>
>
>On Sat, 16 Sep 2000, Alain Knaff wrote:
>>
>> The following patch (against 2.4.0-test8) restores ioctl functionality,
>> which has been broken in 2.4.0-test6-pre7:
>
>No. Th epatch breaks things. You cannot use "permission" at that point,
>and the code was removed on purpose before. Nobody could tell what the
>point in the ugly code was. 

Maybe because nobody had asked? N.B. Here is a revised edition, which
eliminates the problem alluded to (root mounts). If that still isn't
good enough (please tell me), I'll follow up with a patch that uses
the inode passed to fd_ioctl.

>
>Not applied.
>
>               Linus

--- 2.4.0-test8/linux/drivers/block/floppy.c    Mon Sep 11 20:09:28 2000
+++ linux/drivers/block/floppy.c        Sat Sep 16 18:57:14 2000
@@ -3435,6 +3435,7 @@
 static int fd_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
                    unsigned long param)
 {
+#define FD_IOCTL_ALLOWED ((filp) && (filp)->private_data)
 #define OUT(c,x) case c: outparam = (const char *) (x); break
 #define IN(c,x,tag) case c: *(x) = inparam. tag ; return 0
 
@@ -3502,7 +3503,7 @@
                return -EINVAL;
 
        /* permission checks */
-       if (((cmd & 0x40) && !(filp->f_mode & 2)) ||
+       if (((cmd & 0x40) && !FD_IOCTL_ALLOWED) ||
            ((cmd & 0x80) && !capable(CAP_SYS_ADMIN)))
                return -EPERM;
 
@@ -3708,6 +3709,8 @@
                return -EIO;
        }
 
+       filp->private_data = (void*) 0;
+
        drive = DRIVE(inode->i_rdev);
        if (drive >= N_DRIVE ||
            !(allowed_drive_mask & (1 << drive)) ||
@@ -3774,6 +3777,13 @@
                        buffer_track = -1;
                invalidate_buffers(MKDEV(FLOPPY_MAJOR,old_dev));
        }
+
+       /* Allow ioctls if we have write-permissions even if read-only open.
+        * Needed so that programs such as fdrawcmd still can work on write
+        * protected disks */
+       if ((filp->f_mode & 2) || 
+           (inode->i_sb && (permission(inode,2) == 0)))
+           filp->private_data = (void*) 8;
 
        if (UFDCS->rawcmd == 1)
                UFDCS->rawcmd = 2;
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
Please read the FAQ at http://www.tux.org/lkml/

Reply via email to