Check for block device in DRIVE_ReadSuperblock

Michal Janusz Miroslaw M.Miroslaw at elka.pw.edu.pl
Fri Jan 17 20:17:08 CST 2003


I thought, that this may be useful to somebody ... If this patch
were here before it would save me a few hours searching why every
program hanged on commdlg open/save file dialogs ...
I'm sending it here because I'm not sure whether I should be more/less
paranoid and stat() the file before open() or not, or even if this
check really should go into this function.

Decide. ;)

Changelog: [MQ] Add check for block device in DRIVE_ReadSuperblock

Index: files/drive.c
===================================================================
RCS file: /home/wine/wine/files/drive.c,v
retrieving revision 1.83
diff -u -r1.83 drive.c
--- files/drive.c       13 Jan 2003 20:44:13 -0000      1.83
+++ files/drive.c       18 Jan 2003 02:05:38 -0000
@@ -623,20 +623,36 @@
     int fd;
     off_t offs;
     int ret = 0;
+    struct stat stat_buf;

     if (memset(buff,0,DRIVE_SUPER)!=buff) return -1;
     if ((fd=open(DOSDrives[drive].device,O_RDONLY)) == -1)
     {
-       struct stat st;
        if (!DOSDrives[drive].device)
            ERR("No device configured for drive %c: !\n", 'A'+drive);
        else
            ERR("Couldn't open device '%s' for drive %c: ! (%s)\n", DOSDrives[drive].device, 'A'+drive,
-                (stat(DOSDrives[drive].device, &st)) ?
+                (stat(DOSDrives[drive].device, &stat_buf)) ?
                        "not available or symlink not valid ?" : "no permission");
        ERR("Can't read drive volume info ! Either pre-set it or make sure the device to read it from is accessible !\n");
        PROFILE_UsageWineIni();
        return -1;
+    }
+
+    /* MQ: I guess, we don't have to merge this call with the one above - some weird user
+           may try to swap the file before stat() and open() while we're not watching ;)
+          OTOH if we open FIFO we're stuck anyway, so FIXME */
+    if (fstat(fd, &stat_buf) < 0) {    /* shouldn't happen since we just opened that file */
+       ERR("fstat() failed for opened device '%s' (drive %c:) ! IT SHOULDN'T HAPPEN !!!\n",
+           DOSDrives[drive].device, 'A'+drive);
+       ret = -1;
+       goto the_end;
+    }
+    if (!S_ISBLK(stat_buf.st_mode)) {
+       ERR("Device '%s' (drive %c:) is not a block device - check your config\n",
+           DOSDrives[drive].device, 'A'+drive);
+       ret = -1;
+       goto the_end;
     }

     switch(DOSDrives[drive].type)




More information about the wine-devel mailing list