On Thu, Feb 29, 2024 at 7:29 PM Samuel Thibault <samuel.thiba...@gnu.org>
wrote:

> Applied, thanks!
>
> Flavio Cruz, le mer. 28 févr. 2024 22:39:10 -0500, a ecrit:
> > 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/.
>
> That seems unrelated? perl and vim are not making the whole rumpdisk
> server crash, and their failing tests don't seem to be related with
> /dev/cd0?
>

I could be wrong but if you look at this build log
https://buildd.debian.org/status/fetch.php?pkg=perl&arch=hurd-i386&ver=5.38.2-3&stamp=1705087520&raw=0
it fails on t/op/stat:

t/op/stat ........................................................ #
Failed test 36 - ls and -b agreeing on /dev (0 310) at op/stat.t line
322
#      got "0"
# expected "310"
# = before
# total 1912

I did run the suite myself and it did seem to get stuck at listing /dev
when it attempted to open /dev/cd0.

Flavio

>
> > ---
> >  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
> >
> >
>
> --
> Samuel
> ---
> Pour une évaluation indépendante, transparente et rigoureuse !
> Je soutiens la Commission d'Évaluation de l'Inria.
>

Reply via email to