bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH hurd] rumpdisk: do not open device if block size is 0


From: Flavio Cruz
Subject: [PATCH hurd] rumpdisk: do not open device if block size is 0
Date: Wed, 28 Feb 2024 22:39:10 -0500

Currently, if we do:

$ ls /dev/cd0/

The computer seems to get stuck, caused by the divide by 0 in the
rumpdisk server in device_get_status. I noticed that if we have no disk in the
cdrom device, we can still open it but block and media size will be 0
and the message "cd0 dos partition I/O error" will be printed to the
console. To avoid this problem, we check the block size and throw an error
when it is 0. This also works correctly when a disk actually exists.

This should help fix the perl and likely the vim test suites that are
currently failing in https://buildd.debian.org/.
---
 rumpdisk/block-rump.c | 23 +++++++++++++++++------
 1 file changed, 17 insertions(+), 6 deletions(-)

diff --git a/rumpdisk/block-rump.c b/rumpdisk/block-rump.c
index a29ebe73..71435f20 100644
--- a/rumpdisk/block-rump.c
+++ b/rumpdisk/block-rump.c
@@ -277,18 +277,25 @@ rumpdisk_device_open (mach_port_t reply_port, 
mach_msg_type_name_t reply_port_ty
       return rump_errno2host (errno);
     }
 
-  ret = rump_sys_ioctl (fd, DIOCGMEDIASIZE, &media_size);
+  ret = rump_sys_ioctl (fd, DIOCGSECTORSIZE, &block_size);
   if (ret < 0)
     {
-      mach_print ("DIOCGMEDIASIZE ioctl fails\n");
+      mach_print ("DIOCGSECTORSIZE ioctl fails\n");
       pthread_rwlock_unlock (&rumpdisk_rwlock);
       return rump_errno2host (errno);
     }
 
-  ret = rump_sys_ioctl (fd, DIOCGSECTORSIZE, &block_size);
+  if (block_size == 0) {
+    mach_print ("Unable to get block size\n");
+    rump_sys_close (fd);
+    pthread_rwlock_unlock (&rumpdisk_rwlock);
+    return D_IO_ERROR;
+  }
+
+  ret = rump_sys_ioctl (fd, DIOCGMEDIASIZE, &media_size);
   if (ret < 0)
     {
-      mach_print ("DIOCGSECTORSIZE ioctl fails\n");
+      mach_print ("DIOCGMEDIASIZE ioctl fails\n");
       pthread_rwlock_unlock (&rumpdisk_rwlock);
       return rump_errno2host (errno);
     }
@@ -509,8 +516,12 @@ rumpdisk_device_get_status (void *d, dev_flavor_t flavor, 
dev_status_t status,
       break;
     case DEV_GET_RECORDS:
       status[DEV_GET_RECORDS_RECORD_SIZE] = bd->block_size;
-      status[DEV_GET_RECORDS_DEVICE_RECORDS] =
-       bd->media_size / (unsigned long long) bd->block_size;
+      if (bd->block_size == 0)
+       status[DEV_GET_RECORDS_DEVICE_RECORDS] = 0;
+      else {
+       status[DEV_GET_RECORDS_DEVICE_RECORDS] =
+         bd->media_size / (unsigned long long) bd->block_size;
+      }
       *count = 2;
       break;
     default:
-- 
2.43.0




reply via email to

[Prev in Thread] Current Thread [Next in Thread]