[systemd-devel] [PATCH 1/6] fix strict aliasing issues in src/udev/udev-ctrl.c
Ronny Chevalier
chevalier.ronny at gmail.com
Sat Mar 14 06:55:09 PDT 2015
2015-03-11 16:13 GMT+01:00 Shawn Landden <shawn at churchofgit.com>:
> it is ironic that
> "The only purpose of this structure is to cast the structure pointer
> passed in addr in order to avoid compiler warnings. See EXAMPLE below."
> from bind(2)
> ---
> src/udev/udev-ctrl.c | 19 ++++++++++---------
> 1 file changed, 10 insertions(+), 9 deletions(-)
>
> diff --git a/src/udev/udev-ctrl.c b/src/udev/udev-ctrl.c
> index c0c5981..61d3c5b 100644
> --- a/src/udev/udev-ctrl.c
> +++ b/src/udev/udev-ctrl.c
> @@ -18,6 +18,7 @@
> #include <sys/socket.h>
> #include <sys/un.h>
>
> +#include "socket-util.h"
> #include "udev.h"
>
> /* wire protocol magic must match */
> @@ -55,7 +56,7 @@ struct udev_ctrl {
> int refcount;
> struct udev *udev;
> int sock;
> - struct sockaddr_un saddr;
> + union sockaddr_union saddr;
> socklen_t addrlen;
> bool bound;
> bool cleanup_socket;
> @@ -94,9 +95,9 @@ struct udev_ctrl *udev_ctrl_new_from_fd(struct udev *udev, int fd) {
> if (r < 0)
> log_warning_errno(errno, "could not set SO_PASSCRED: %m");
>
> - uctrl->saddr.sun_family = AF_LOCAL;
> - strscpy(uctrl->saddr.sun_path, sizeof(uctrl->saddr.sun_path), "/run/udev/control");
> - uctrl->addrlen = offsetof(struct sockaddr_un, sun_path) + strlen(uctrl->saddr.sun_path);
> + uctrl->saddr.un.sun_family = AF_LOCAL;
> + strscpy(uctrl->saddr.un.sun_path, sizeof(uctrl->saddr.un.sun_path), "/run/udev/control");
> + uctrl->addrlen = offsetof(struct sockaddr_un, sun_path) + strlen(uctrl->saddr.un.sun_path);
> return uctrl;
> }
>
> @@ -108,10 +109,10 @@ int udev_ctrl_enable_receiving(struct udev_ctrl *uctrl) {
> int err;
>
> if (!uctrl->bound) {
> - err = bind(uctrl->sock, (struct sockaddr *)&uctrl->saddr, uctrl->addrlen);
> + err = bind(uctrl->sock, &uctrl->saddr.sa, uctrl->addrlen);
> if (err < 0 && errno == EADDRINUSE) {
> - unlink(uctrl->saddr.sun_path);
> - err = bind(uctrl->sock, (struct sockaddr *)&uctrl->saddr, uctrl->addrlen);
> + unlink(uctrl->saddr.un.sun_path);
> + err = bind(uctrl->sock, &uctrl->saddr.sa, uctrl->addrlen);
> }
>
> if (err < 0) {
> @@ -160,7 +161,7 @@ int udev_ctrl_cleanup(struct udev_ctrl *uctrl) {
> if (uctrl == NULL)
> return 0;
> if (uctrl->cleanup_socket)
> - unlink(uctrl->saddr.sun_path);
> + unlink(uctrl->saddr.un.sun_path);
> return 0;
> }
>
> @@ -249,7 +250,7 @@ static int ctrl_send(struct udev_ctrl *uctrl, enum udev_ctrl_msg_type type, int
> ctrl_msg_wire.intval = intval;
>
> if (!uctrl->connected) {
> - if (connect(uctrl->sock, (struct sockaddr *)&uctrl->saddr, uctrl->addrlen) < 0) {
> + if (connect(uctrl->sock, &uctrl->saddr.sa, uctrl->addrlen) < 0) {
> err = -errno;
> goto out;
> }
> --
> 2.2.1.209.g41e5f3a
Applied, thanks!
Ronny
More information about the systemd-devel
mailing list