Only return file descriptors to block or character devices
authorkn <kn@openbsd.org>
Thu, 25 Aug 2022 17:09:54 +0000 (17:09 +0000)
committerkn <kn@openbsd.org>
Thu, 25 Aug 2022 17:09:54 +0000 (17:09 +0000)
commit2533f6f486558681bd73bccc34e7f5b9720d5fb5
treef6de1f75379acf6a13084ca8ebc4468e396237c0
parente479af8fa4f6cc7278dd6555d8733e04e4b415bd
Only return file descriptors to block or character devices

If the requested path contained a slash, opendev(3) blindly opened the file
and returned a file descriptor to it.

Check for block or character devices (according to OPENDEV_BLCK) and fail
for other types.

Spotted through installboot(8) which happily opened a stage file as device
when forgetting the device argument:
# installboot -v ./biosboot
Using / as root
installing bootstrap on ./biosboot
using first-stage /usr/mdec/biosboot, second-stage /usr/mdec/boot
installboot: disklabel: ./biosboot: Inappropriate ioctl for device

This makes it fail earlier, as expected:
# installboot -v ./biosboot
installboot: open: ./biosboot: Block device required

The case where opendev(3) is passed a string not containing a slash, i.e.
a supposed DUID, is fine, as diskmap(4) will ensure that only valid device
paths are returned, if the DUID is valid.

Feedback OK millert
lib/libutil/opendev.3
lib/libutil/opendev.c