chiark / gitweb /
[PATCH] udevd - fix socket path length
[elogind.git] / udevd.c
diff --git a/udevd.c b/udevd.c
index f8b8c27ee4ad51a0f6679aa7e71969247035198a..10d67f2c359995c861ecb94a554d855b14852b00 100644 (file)
--- a/udevd.c
+++ b/udevd.c
@@ -325,7 +325,6 @@ static void sig_handler(int signum)
                case SIGINT:
                case SIGTERM:
                        unlink(UDEVD_LOCK);
-                       unlink(UDEVD_SOCK);
                        exit(20 + signum);
                        break;
                default:
@@ -361,6 +360,7 @@ int main(int argc, char *argv[])
        int csock;
        struct sockaddr_un saddr;
        struct sockaddr_un caddr;
+       socklen_t addrlen;
        socklen_t clen;
        pthread_t cli_tid;
        pthread_t mgr_msg_tid;
@@ -378,16 +378,17 @@ int main(int argc, char *argv[])
 
        memset(&saddr, 0x00, sizeof(saddr));
        saddr.sun_family = AF_LOCAL;
-       strcpy(saddr.sun_path, UDEVD_SOCK);
+       /* use abstract namespace for socket path */
+       strcpy(&saddr.sun_path[1], UDEVD_SOCK_PATH);
+       addrlen = offsetof(struct sockaddr_un, sun_path) + strlen(saddr.sun_path+1) + 1;
 
-       unlink(UDEVD_SOCK);
        ssock = socket(AF_LOCAL, SOCK_STREAM, 0);
        if (ssock == -1) {
                dbg("error getting socket");
                exit(1);
        }
 
-       retval = bind(ssock, &saddr, sizeof(saddr));
+       retval = bind(ssock, &saddr, addrlen);
        if (retval < 0) {
                dbg("bind failed\n");
                goto exit;
@@ -426,6 +427,5 @@ int main(int argc, char *argv[])
        }
 exit:
        close(ssock);
-       unlink(UDEVD_SOCK);
        exit(1);
 }