X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flibudev%2Flibudev-monitor.c;h=0d361426f7c23c7354cbc9e544ed4a6ff5e54e67;hb=9c89c1cabd0357fa4e58a91c4d9233702896b709;hp=e8d6b4a61b2a2520f5cbe9a15cfe1677c7673c4d;hpb=56f64d95763a799ba4475daf44d8e9f72a1bd474;p=elogind.git diff --git a/src/libudev/libudev-monitor.c b/src/libudev/libudev-monitor.c index e8d6b4a61..0d361426f 100644 --- a/src/libudev/libudev-monitor.c +++ b/src/libudev/libudev-monitor.c @@ -582,7 +582,10 @@ _public_ struct udev_device *udev_monitor_receive_device(struct udev_monitor *ud struct cmsghdr *cmsg; union sockaddr_union snl; struct ucred *cred; - char buf[8192]; + union { + struct udev_monitor_netlink_header nlh; + char raw[8192]; + } buf; ssize_t buflen; ssize_t bufpos; @@ -606,7 +609,7 @@ retry: return NULL; } - if (buflen < 32 || (size_t)buflen >= sizeof(buf)) { + if (buflen < 32 || (smsg.msg_flags & MSG_TRUNC)) { log_debug("invalid message length"); return NULL; } @@ -642,29 +645,26 @@ retry: if (udev_device == NULL) return NULL; - if (memcmp(buf, "libudev", 8) == 0) { - struct udev_monitor_netlink_header *nlh; - + if (memcmp(buf.raw, "libudev", 8) == 0) { /* udev message needs proper version magic */ - nlh = (struct udev_monitor_netlink_header *) buf; - if (nlh->magic != htonl(UDEV_MONITOR_MAGIC)) { + if (buf.nlh.magic != htonl(UDEV_MONITOR_MAGIC)) { log_debug("unrecognized message signature (%x != %x)", - nlh->magic, htonl(UDEV_MONITOR_MAGIC)); + buf.nlh.magic, htonl(UDEV_MONITOR_MAGIC)); udev_device_unref(udev_device); return NULL; } - if (nlh->properties_off+32 > (size_t)buflen) { + if (buf.nlh.properties_off+32 > (size_t)buflen) { udev_device_unref(udev_device); return NULL; } - bufpos = nlh->properties_off; + bufpos = buf.nlh.properties_off; /* devices received from udev are always initialized */ udev_device_set_is_initialized(udev_device); } else { /* kernel message with header */ - bufpos = strlen(buf) + 1; + bufpos = strlen(buf.raw) + 1; if ((size_t)bufpos < sizeof("a@/d") || bufpos >= buflen) { log_debug("invalid message length"); udev_device_unref(udev_device); @@ -672,7 +672,7 @@ retry: } /* check message header */ - if (strstr(buf, "@/") == NULL) { + if (strstr(buf.raw, "@/") == NULL) { log_debug("unrecognized message header"); udev_device_unref(udev_device); return NULL; @@ -685,7 +685,7 @@ retry: char *key; size_t keylen; - key = &buf[bufpos]; + key = &buf.raw[bufpos]; keylen = strlen(key); if (keylen == 0) break;