summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlavio Cruz <flaviocruz@gmail.com>2024-02-28 22:39:10 -0500
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2024-03-01 01:25:42 +0100
commit1afe753f75f1e64254c8e29c4c2030e25fa95392 (patch)
tree914c58009548fc9966640015da366783661b26cc
parentd0e63556c4fd10cf3627b6e5c292a1f178a5578f (diff)
rumpdisk: do not open device if block size is 0
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/. Message-ID: <Zd_8XjcHcbNIp5NM@mars.tail36e24.ts.net>
-rw-r--r--rumpdisk/block-rump.c23
1 files 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: