diff options
author | Lennart Poettering <lennart@poettering.net> | 2022-09-17 19:03:15 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-09-17 19:03:15 +0200 |
commit | 0ea720ca7ea03a3dbf21a5d152e294b9a293dc3d (patch) | |
tree | 9f2b3217706eb05db1e260f2eddfd11e35f21275 /src/udev | |
parent | Merge pull request #24708 from keszybz/not-available-in-tables (diff) | |
parent | udev: use read_virtual_file() at one more place (diff) | |
download | systemd-0ea720ca7ea03a3dbf21a5d152e294b9a293dc3d.tar.xz systemd-0ea720ca7ea03a3dbf21a5d152e294b9a293dc3d.zip |
Merge pull request #24622 from yuwata/udev-open-with-noctty
udev: open with O_NOCTTY
Diffstat (limited to 'src/udev')
-rw-r--r-- | src/udev/ata_id/ata_id.c | 2 | ||||
-rw-r--r-- | src/udev/cdrom_id/cdrom_id.c | 2 | ||||
-rw-r--r-- | src/udev/fido_id/fido_id.c | 2 | ||||
-rw-r--r-- | src/udev/mtd_probe/mtd_probe.c | 2 | ||||
-rw-r--r-- | src/udev/scsi_id/scsi_serial.c | 4 | ||||
-rw-r--r-- | src/udev/udev-builtin-blkid.c | 2 | ||||
-rw-r--r-- | src/udev/udev-builtin-btrfs.c | 2 | ||||
-rw-r--r-- | src/udev/udev-builtin-input_id.c | 2 | ||||
-rw-r--r-- | src/udev/udev-builtin-net_id.c | 34 | ||||
-rw-r--r-- | src/udev/udev-builtin-usb_id.c | 2 | ||||
-rw-r--r-- | src/udev/udevadm-lock.c | 2 | ||||
-rw-r--r-- | src/udev/udevd.c | 4 |
12 files changed, 33 insertions, 27 deletions
diff --git a/src/udev/ata_id/ata_id.c b/src/udev/ata_id/ata_id.c index 1fc27f4b64..f451c0d0e1 100644 --- a/src/udev/ata_id/ata_id.c +++ b/src/udev/ata_id/ata_id.c @@ -439,7 +439,7 @@ int main(int argc, char *argv[]) { return 1; } - fd = open(node, O_RDONLY|O_NONBLOCK|O_CLOEXEC); + fd = open(node, O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_NOCTTY); if (fd < 0) { log_error("unable to open '%s'", node); return 1; diff --git a/src/udev/cdrom_id/cdrom_id.c b/src/udev/cdrom_id/cdrom_id.c index 2d758c4082..5945dcbbae 100644 --- a/src/udev/cdrom_id/cdrom_id.c +++ b/src/udev/cdrom_id/cdrom_id.c @@ -743,7 +743,7 @@ static int open_drive(Context *c) { assert(c->fd < 0); for (int cnt = 0;; cnt++) { - fd = open(arg_node, O_RDONLY|O_NONBLOCK|O_CLOEXEC); + fd = open(arg_node, O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_NOCTTY); if (fd >= 0) break; if (++cnt >= 20 || errno != EBUSY) diff --git a/src/udev/fido_id/fido_id.c b/src/udev/fido_id/fido_id.c index a9f5f8f8a6..58a2827818 100644 --- a/src/udev/fido_id/fido_id.c +++ b/src/udev/fido_id/fido_id.c @@ -67,7 +67,7 @@ static int run(int argc, char **argv) { if (!desc_path) return log_oom(); - fd = open(desc_path, O_RDONLY | O_NOFOLLOW | O_CLOEXEC); + fd = open(desc_path, O_RDONLY | O_NOFOLLOW | O_CLOEXEC | O_NOCTTY); if (fd < 0) return log_device_error_errno(hid_device, errno, "Failed to open report descriptor at '%s': %m", desc_path); diff --git a/src/udev/mtd_probe/mtd_probe.c b/src/udev/mtd_probe/mtd_probe.c index df1f1c173a..d5fb64f194 100644 --- a/src/udev/mtd_probe/mtd_probe.c +++ b/src/udev/mtd_probe/mtd_probe.c @@ -41,7 +41,7 @@ int main(int argc, char** argv) { return EXIT_FAILURE; } - mtd_fd = open(argv[1], O_RDONLY|O_CLOEXEC); + mtd_fd = open(argv[1], O_RDONLY|O_CLOEXEC|O_NOCTTY); if (mtd_fd < 0) { log_error_errno(errno, "Failed to open: %m"); return EXIT_FAILURE; diff --git a/src/udev/scsi_id/scsi_serial.c b/src/udev/scsi_id/scsi_serial.c index 60e2b40c27..f1ce8601bd 100644 --- a/src/udev/scsi_id/scsi_serial.c +++ b/src/udev/scsi_id/scsi_serial.c @@ -751,7 +751,7 @@ int scsi_std_inquiry(struct scsi_id_device *dev_scsi, const char *devname) { struct stat statbuf; int err = 0; - fd = open(devname, O_RDONLY | O_NONBLOCK | O_CLOEXEC); + fd = open(devname, O_RDONLY | O_NONBLOCK | O_CLOEXEC | O_NOCTTY); if (fd < 0) { log_debug_errno(errno, "scsi_id: cannot open %s: %m", devname); return 1; @@ -795,7 +795,7 @@ int scsi_get_serial(struct scsi_id_device *dev_scsi, const char *devname, for (cnt = 20; cnt > 0; cnt--) { struct timespec duration; - fd = open(devname, O_RDONLY | O_NONBLOCK | O_CLOEXEC); + fd = open(devname, O_RDONLY | O_NONBLOCK | O_CLOEXEC | O_NOCTTY); if (fd >= 0 || errno != EBUSY) break; duration.tv_sec = 0; diff --git a/src/udev/udev-builtin-blkid.c b/src/udev/udev-builtin-blkid.c index f992c8f4c5..6de470c71d 100644 --- a/src/udev/udev-builtin-blkid.c +++ b/src/udev/udev-builtin-blkid.c @@ -310,7 +310,7 @@ static int builtin_blkid(sd_device *dev, sd_netlink **rtnl, int argc, char *argv if (r < 0) return log_device_debug_errno(dev, r, "Failed to get device name: %m"); - fd = sd_device_open(dev, O_RDONLY|O_CLOEXEC|O_NONBLOCK); + fd = sd_device_open(dev, O_RDONLY|O_CLOEXEC|O_NONBLOCK|O_NOCTTY); if (fd < 0) { bool ignore = ERRNO_IS_DEVICE_ABSENT(fd); log_device_debug_errno(dev, fd, "Failed to open block device %s%s: %m", diff --git a/src/udev/udev-builtin-btrfs.c b/src/udev/udev-builtin-btrfs.c index f9d4f1dd4e..8cd627807f 100644 --- a/src/udev/udev-builtin-btrfs.c +++ b/src/udev/udev-builtin-btrfs.c @@ -21,7 +21,7 @@ static int builtin_btrfs(sd_device *dev, sd_netlink **rtnl, int argc, char *argv if (argc != 3 || !streq(argv[1], "ready")) return log_device_error_errno(dev, SYNTHETIC_ERRNO(EINVAL), "Invalid arguments"); - fd = open("/dev/btrfs-control", O_RDWR|O_CLOEXEC); + fd = open("/dev/btrfs-control", O_RDWR|O_CLOEXEC|O_NOCTTY); if (fd < 0) { if (ERRNO_IS_DEVICE_ABSENT(errno)) { /* Driver not installed? Then we aren't ready. This is useful in initrds that lack diff --git a/src/udev/udev-builtin-input_id.c b/src/udev/udev-builtin-input_id.c index 6da8ad85bb..0742120248 100644 --- a/src/udev/udev-builtin-input_id.c +++ b/src/udev/udev-builtin-input_id.c @@ -50,7 +50,7 @@ static void extract_info(sd_device *dev, bool test) { struct input_absinfo xabsinfo = {}, yabsinfo = {}; _cleanup_close_ int fd = -1; - fd = sd_device_open(dev, O_RDONLY|O_CLOEXEC|O_NONBLOCK); + fd = sd_device_open(dev, O_RDONLY|O_CLOEXEC|O_NONBLOCK|O_NOCTTY); if (fd < 0) return; diff --git a/src/udev/udev-builtin-net_id.c b/src/udev/udev-builtin-net_id.c index 4749cb4cf2..c1ad190ca8 100644 --- a/src/udev/udev-builtin-net_id.c +++ b/src/udev/udev-builtin-net_id.c @@ -229,23 +229,29 @@ static int dev_pci_onboard(sd_device *dev, const LinkInfo *info, NetNames *names } /* read the 256 bytes PCI configuration space to check the multi-function bit */ -static bool is_pci_multifunction(sd_device *dev) { - _cleanup_close_ int fd = -1; +static int is_pci_multifunction(sd_device *dev) { + _cleanup_free_ uint8_t *config = NULL; const char *filename, *syspath; - uint8_t config[64]; + size_t len; + int r; - if (sd_device_get_syspath(dev, &syspath) < 0) - return false; + r = sd_device_get_syspath(dev, &syspath); + if (r < 0) + return r; filename = strjoina(syspath, "/config"); - fd = open(filename, O_RDONLY | O_CLOEXEC); - if (fd < 0) - return false; - if (read(fd, &config, sizeof(config)) != sizeof(config)) - return false; + r = read_virtual_file(filename, PCI_HEADER_TYPE + 1, (char **) &config, &len); + if (r < 0) + return r; + if (len < PCI_HEADER_TYPE + 1) + return -EINVAL; + +#ifndef PCI_HEADER_TYPE_MULTIFUNC +#define PCI_HEADER_TYPE_MULTIFUNC 0x80 +#endif /* bit 0-6 header type, bit 7 multi/single function device */ - return config[PCI_HEADER_TYPE] & 0x80; + return config[PCI_HEADER_TYPE] & PCI_HEADER_TYPE_MULTIFUNC; } static bool is_pci_ari_enabled(sd_device *dev) { @@ -384,7 +390,7 @@ static int dev_pci_slot(sd_device *dev, const LinkInfo *info, NetNames *names) { if (domain > 0) l = strpcpyf(&s, l, "P%u", domain); l = strpcpyf(&s, l, "p%us%u", bus, slot); - if (func > 0 || is_pci_multifunction(names->pcidev)) + if (func > 0 || is_pci_multifunction(names->pcidev) > 0) l = strpcpyf(&s, l, "f%u", func); if (!isempty(info->phys_port_name)) /* kernel provided front panel port name for multi-port PCI device */ @@ -452,7 +458,7 @@ static int dev_pci_slot(sd_device *dev, const LinkInfo *info, NetNames *names) { * devices that will try to claim the same index and that would create name * collision. */ if (naming_scheme_has(NAMING_BRIDGE_NO_SLOT) && is_pci_bridge(hotplug_slot_dev)) { - if (naming_scheme_has(NAMING_BRIDGE_MULTIFUNCTION_SLOT) && !is_pci_multifunction(names->pcidev)) { + if (naming_scheme_has(NAMING_BRIDGE_MULTIFUNCTION_SLOT) && is_pci_multifunction(names->pcidev) <= 0) { log_device_debug(dev, "Not using slot information because the PCI device associated with the hotplug slot is a bridge and the PCI device has single function."); return 0; } @@ -479,7 +485,7 @@ static int dev_pci_slot(sd_device *dev, const LinkInfo *info, NetNames *names) { if (domain > 0) l = strpcpyf(&s, l, "P%u", domain); l = strpcpyf(&s, l, "s%"PRIu32, hotplug_slot); - if (func > 0 || is_pci_multifunction(names->pcidev)) + if (func > 0 || is_pci_multifunction(names->pcidev) > 0) l = strpcpyf(&s, l, "f%u", func); if (!isempty(info->phys_port_name)) l = strpcpyf(&s, l, "n%s", info->phys_port_name); diff --git a/src/udev/udev-builtin-usb_id.c b/src/udev/udev-builtin-usb_id.c index eb32661255..d94718f468 100644 --- a/src/udev/udev-builtin-usb_id.c +++ b/src/udev/udev-builtin-usb_id.c @@ -158,7 +158,7 @@ static int dev_if_packed_info(sd_device *dev, char *ifs_str, size_t len) { return r; filename = strjoina(syspath, "/descriptors"); - fd = open(filename, O_RDONLY|O_CLOEXEC); + fd = open(filename, O_RDONLY|O_CLOEXEC|O_NOCTTY); if (fd < 0) return log_device_debug_errno(dev, errno, "Failed to open \"%s\": %m", filename); diff --git a/src/udev/udevadm-lock.c b/src/udev/udevadm-lock.c index a3be2336af..35e9999c01 100644 --- a/src/udev/udevadm-lock.c +++ b/src/udev/udevadm-lock.c @@ -180,7 +180,7 @@ static int lock_device( struct stat st; int r; - fd = open(path, O_RDONLY|O_CLOEXEC|O_NONBLOCK); + fd = open(path, O_RDONLY|O_CLOEXEC|O_NONBLOCK|O_NOCTTY); if (fd < 0) return log_error_errno(errno, "Failed to open '%s': %m", path); diff --git a/src/udev/udevd.c b/src/udev/udevd.c index 8451313f55..20a9a8cdbe 100644 --- a/src/udev/udevd.c +++ b/src/udev/udevd.c @@ -544,7 +544,7 @@ static int worker_lock_whole_disk(sd_device *dev, int *ret_fd) { if (r == 0) goto nolock; - fd = sd_device_open(dev_whole_disk, O_RDONLY|O_CLOEXEC|O_NONBLOCK); + fd = sd_device_open(dev_whole_disk, O_RDONLY|O_CLOEXEC|O_NONBLOCK|O_NOCTTY); if (fd < 0) { bool ignore = ERRNO_IS_DEVICE_ABSENT(fd); @@ -599,7 +599,7 @@ static int worker_mark_block_device_read_only(sd_device *dev) { if (STARTSWITH_SET(val, "dm-", "md", "drbd", "loop", "nbd", "zram")) return 0; - fd = sd_device_open(dev, O_RDONLY|O_CLOEXEC|O_NONBLOCK); + fd = sd_device_open(dev, O_RDONLY|O_CLOEXEC|O_NONBLOCK|O_NOCTTY); if (fd < 0) return log_device_debug_errno(dev, fd, "Failed to open '%s', ignoring: %m", val); |