From b49d9b50cfd377f28de0886330ba7bbd231fb472 Mon Sep 17 00:00:00 2001 From: Kay Sievers Date: Fri, 13 Apr 2012 15:08:55 +0200 Subject: [PATCH 1/1] udev: fix a few issues detected by the llvm static analyzer --- Makefile.am | 4 +-- src/udev/ata_id/ata_id.c | 1 - src/udev/libudev-monitor.c | 47 ++++++++++++++++---------------- src/udev/libudev-util-private.c | 3 +- src/udev/udev-builtin-blkid.c | 4 +-- src/udev/udev-builtin-firmware.c | 2 +- src/udev/udev-event.c | 4 +-- src/udev/udevadm-settle.c | 2 +- src/udev/udevd.c | 1 - 9 files changed, 32 insertions(+), 36 deletions(-) diff --git a/Makefile.am b/Makefile.am index 57a149eb3..34e3982de 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1518,9 +1518,9 @@ DISTCLEAN_LOCAL_HOOKS += test-sys-distclean EXTRA_DIST += \ src/udev/test/sys.tar.xz \ - src/udev/test/rule-syntax-check.py \ src/udev/test/udev-test.pl \ - src/udev/test/rules-test.sh + src/udev/test/rules-test.sh \ + src/udev/test/rule-syntax-check.py # ------------------------------------------------------------------------------ ata_id_SOURCES = \ diff --git a/src/udev/ata_id/ata_id.c b/src/udev/ata_id/ata_id.c index fe160bf1e..be064187f 100644 --- a/src/udev/ata_id/ata_id.c +++ b/src/udev/ata_id/ata_id.c @@ -360,7 +360,6 @@ static int disk_identify(struct udev *udev, int is_packet_device; /* init results */ - ret = -1; memset(out_identify, '\0', 512); is_packet_device = 0; diff --git a/src/udev/libudev-monitor.c b/src/udev/libudev-monitor.c index 5ff340a9e..4406b55f9 100644 --- a/src/udev/libudev-monitor.c +++ b/src/udev/libudev-monitor.c @@ -26,6 +26,7 @@ #include "libudev.h" #include "libudev-private.h" +#include "socket-util.h" /** * SECTION:libudev-monitor @@ -43,9 +44,9 @@ struct udev_monitor { struct udev *udev; int refcount; int sock; - struct sockaddr_nl snl; - struct sockaddr_nl snl_trusted_sender; - struct sockaddr_nl snl_destination; + union sockaddr_union snl; + union sockaddr_union snl_trusted_sender; + union sockaddr_union snl_destination; socklen_t addrlen; struct udev_list filter_subsystem_list; struct udev_list filter_tag_list; @@ -144,12 +145,12 @@ struct udev_monitor *udev_monitor_new_from_netlink_fd(struct udev *udev, const c udev_monitor->sock = fd; } - udev_monitor->snl.nl_family = AF_NETLINK; - udev_monitor->snl.nl_groups = group; + udev_monitor->snl.nl.nl_family = AF_NETLINK; + udev_monitor->snl.nl.nl_groups = group; /* default destination for sending */ - udev_monitor->snl_destination.nl_family = AF_NETLINK; - udev_monitor->snl_destination.nl_groups = UDEV_MONITOR_UDEV; + udev_monitor->snl_destination.nl.nl_family = AF_NETLINK; + udev_monitor->snl_destination.nl.nl_groups = UDEV_MONITOR_UDEV; return udev_monitor; } @@ -314,7 +315,7 @@ _public_ int udev_monitor_filter_update(struct udev_monitor *udev_monitor) int udev_monitor_allow_unicast_sender(struct udev_monitor *udev_monitor, struct udev_monitor *sender) { - udev_monitor->snl_trusted_sender.nl_pid = sender->snl.nl_pid; + udev_monitor->snl_trusted_sender.nl.nl_pid = sender->snl.nl.nl_pid; return 0; } /** @@ -330,20 +331,20 @@ _public_ int udev_monitor_enable_receiving(struct udev_monitor *udev_monitor) int err = 0; const int on = 1; - if (udev_monitor->snl.nl_family == 0) + if (udev_monitor->snl.nl.nl_family == 0) return -EINVAL; udev_monitor_filter_update(udev_monitor); if (!udev_monitor->bound) { err = bind(udev_monitor->sock, - (struct sockaddr *)&udev_monitor->snl, sizeof(struct sockaddr_nl)); + &udev_monitor->snl.sa, sizeof(struct sockaddr_nl)); if (err == 0) udev_monitor->bound = true; } if (err >= 0) { - struct sockaddr_nl snl; + union sockaddr_union snl; socklen_t addrlen; /* @@ -351,9 +352,9 @@ _public_ int udev_monitor_enable_receiving(struct udev_monitor *udev_monitor) * it is usually, but not necessarily the pid */ addrlen = sizeof(struct sockaddr_nl); - err = getsockname(udev_monitor->sock, (struct sockaddr *)&snl, &addrlen); + err = getsockname(udev_monitor->sock, &snl.sa, &addrlen); if (err == 0) - udev_monitor->snl.nl_pid = snl.nl_pid; + udev_monitor->snl.nl.nl_pid = snl.nl.nl_pid; } else { err(udev_monitor->udev, "bind failed: %m\n"); return err; @@ -518,7 +519,7 @@ _public_ struct udev_device *udev_monitor_receive_device(struct udev_monitor *ud struct iovec iov; char cred_msg[CMSG_SPACE(sizeof(struct ucred))]; struct cmsghdr *cmsg; - struct sockaddr_nl snl; + union sockaddr_union snl; struct ucred *cred; char buf[8192]; ssize_t buflen; @@ -536,7 +537,7 @@ retry: smsg.msg_control = cred_msg; smsg.msg_controllen = sizeof(cred_msg); - if (udev_monitor->snl.nl_family != 0) { + if (udev_monitor->snl.nl.nl_family != 0) { smsg.msg_name = &snl; smsg.msg_namelen = sizeof(snl); } @@ -553,18 +554,18 @@ retry: return NULL; } - if (udev_monitor->snl.nl_family != 0) { - if (snl.nl_groups == 0) { + if (udev_monitor->snl.nl.nl_family != 0) { + if (snl.nl.nl_groups == 0) { /* unicast message, check if we trust the sender */ - if (udev_monitor->snl_trusted_sender.nl_pid == 0 || - snl.nl_pid != udev_monitor->snl_trusted_sender.nl_pid) { + if (udev_monitor->snl_trusted_sender.nl.nl_pid == 0 || + snl.nl.nl_pid != udev_monitor->snl_trusted_sender.nl.nl_pid) { dbg(udev_monitor->udev, "unicast netlink message ignored\n"); return NULL; } - } else if (snl.nl_groups == UDEV_MONITOR_KERNEL) { - if (snl.nl_pid > 0) { + } else if (snl.nl.nl_groups == UDEV_MONITOR_KERNEL) { + if (snl.nl.nl_pid > 0) { dbg(udev_monitor->udev, "multicast kernel netlink message from pid %d ignored\n", - snl.nl_pid); + snl.nl.nl_pid); return NULL; } } @@ -663,7 +664,7 @@ int udev_monitor_send_device(struct udev_monitor *udev_monitor, struct udev_list_entry *list_entry; uint64_t tag_bloom_bits; - if (udev_monitor->snl.nl_family == 0) + if (udev_monitor->snl.nl.nl_family == 0) return -EINVAL; blen = udev_device_get_properties_monitor_buf(udev_device, &buf); diff --git a/src/udev/libudev-util-private.c b/src/udev/libudev-util-private.c index 2b2752bb5..44ff02cc3 100644 --- a/src/udev/libudev-util-private.c +++ b/src/udev/libudev-util-private.c @@ -143,14 +143,13 @@ gid_t util_lookup_group(struct udev *udev, const char *group) struct group *gr; gid_t gid = 0; size_t buflen = sysconf(_SC_GETPW_R_SIZE_MAX); - char *buf = alloca(buflen); + char *buf = NULL; if (strcmp(group, "root") == 0) return 0; gid = strtoul(group, &endptr, 10); if (endptr[0] == '\0') return gid; - buf = NULL; gid = 0; for (;;) { char *newbuf; diff --git a/src/udev/udev-builtin-blkid.c b/src/udev/udev-builtin-blkid.c index c6dee9c3c..fdc68d00a 100644 --- a/src/udev/udev-builtin-blkid.c +++ b/src/udev/udev-builtin-blkid.c @@ -150,10 +150,8 @@ static int builtin_blkid(struct udev_device *dev, int argc, char *argv[], bool t } pr = blkid_new_probe(); - if (!pr) { - err = -ENOMEM; + if (!pr) return EXIT_FAILURE; - } blkid_probe_set_superblocks_flags(pr, BLKID_SUBLKS_LABEL | BLKID_SUBLKS_UUID | diff --git a/src/udev/udev-builtin-firmware.c b/src/udev/udev-builtin-firmware.c index 0bc09e004..146a57706 100644 --- a/src/udev/udev-builtin-firmware.c +++ b/src/udev/udev-builtin-firmware.c @@ -84,7 +84,7 @@ static int builtin_firmware(struct udev_device *dev, int argc, char *argv[], boo char datapath[UTIL_PATH_SIZE]; char fwpath[UTIL_PATH_SIZE]; const char *firmware; - FILE *fwfile; + FILE *fwfile = NULL; struct utsname kernel; struct stat statbuf; unsigned int i; diff --git a/src/udev/udev-event.c b/src/udev/udev-event.c index debda61ee..bea316c18 100644 --- a/src/udev/udev-event.c +++ b/src/udev/udev-event.c @@ -715,8 +715,8 @@ int udev_event_spawn(struct udev_event *event, log_debug("starting '%s'\n", cmd); - err = spawn_exec(event, cmd, argv, envp, sigmask, - outpipe[WRITE_END], errpipe[WRITE_END]); + spawn_exec(event, cmd, argv, envp, sigmask, + outpipe[WRITE_END], errpipe[WRITE_END]); _exit(2 ); case -1: diff --git a/src/udev/udevadm-settle.c b/src/udev/udevadm-settle.c index d7fbc9e56..19c1e99cc 100644 --- a/src/udev/udevadm-settle.c +++ b/src/udev/udevadm-settle.c @@ -53,7 +53,7 @@ static int adm_settle(struct udev *udev, int argc, char *argv[]) int quiet = 0; const char *exists = NULL; unsigned int timeout = 120; - struct pollfd pfd[1]; + struct pollfd pfd[1] = { {.fd = -1}, }; struct udev_queue *udev_queue = NULL; int rc = EXIT_FAILURE; diff --git a/src/udev/udevd.c b/src/udev/udevd.c index fc33ff011..da044fcdc 100644 --- a/src/udev/udevd.c +++ b/src/udev/udevd.c @@ -329,7 +329,6 @@ static void worker_new(struct event *event) if (fdcount < 0) { if (errno == EINTR) continue; - err = -errno; log_error("failed to poll: %m\n"); goto out; } -- 2.30.2