Files
freebsd/stand
Roman Bogorodskiy 4445d03958 stand: userboot: improve userdisk error handling
Currently, userdisk_init() iterates through disks and
checks whether DIOCGSECTORSIZE and DIOCGMEDIASIZE ioctls
are available for the device. If either ioctl fails, userdisk_init()
returns ENXIO with ud_info only partially initialized.
devinit() records the failure, but loader_main() ignores
devinit()'s return value, so later code may access an
uninitialized entry.

In certain cases this code can still boot from a disk even if
userdisk_init() returns ENXIO, for example, when the first of
two disks is valid and the second errors out.

To address this issue while not breaking the current behavior, do
the following:

 - Zero-initialize the userdisk_info array and use a zero media size
   to mark disks that do not support the ioctls mentioned above or
   report an empty medium.
 - Update userdisk_print() not to print unusable disks.
 - Update userdisk_open() to return EIO for unusable disks.
 - Update extract_currdev() to pick the first usable disk
   instead of the first disk. Introduce userboot_disk_firstunit()
   for that.

Additionally, reset counters on ud_info allocation failure to prevent
accessing unallocated data.

Reviewed by:	jhb (previous version), markj
MFC after:	2 weeks
Sponsored by:	The FreeBSD Foundation
Differential Revision:	https://reviews.freebsd.org/D59262
2026-10-06 16:51:40 +00:00
..
2026-09-08 04:05:26 +01:00
2026-10-03 23:17:08 -06:00
…
2026-10-03 23:17:08 -06:00
2026-10-03 23:17:08 -06:00
2026-09-01 10:26:26 -06:00
2026-10-03 23:17:08 -06:00
2026-10-03 23:17:08 -06:00
…
…
…
…
2026-04-17 20:41:43 -06:00