]> git.ipfire.org Git - thirdparty/glibc.git/blobdiff - inet/rexec.c
Conditionalize use of PTR_MANGLE.
[thirdparty/glibc.git] / inet / rexec.c
index 3c14836aa2c7427647d6a4076b5cc8e3f6ec32d5..75bb47082b3fa4f2cf7688b81b396f1eefebaf63 100644 (file)
@@ -56,7 +56,7 @@ rexec_af(ahost, rport, name, pass, cmd, fd2p, af)
        int *fd2p;
        sa_family_t af;
 {
-       struct sockaddr_storage sa2, from;
+       struct sockaddr_storage from;
        struct addrinfo hints, *res0;
        const char *orig_name = name;
        const char *orig_pass = pass;
@@ -87,8 +87,11 @@ rexec_af(ahost, rport, name, pass, cmd, fd2p, af)
                        return (-1);
                }
                *ahost = ahostbuf;
-       } else
+       } else {
                *ahost = NULL;
+               __set_errno (ENOENT);
+               return -1;
+       }
        ruserpass(res0->ai_canonname, &name, &pass);
 retry:
        s = __socket(res0->ai_family, res0->ai_socktype, 0);
@@ -111,7 +114,13 @@ retry:
                port = 0;
        } else {
                char num[32];
-               int s2, sa2len;
+               int s2;
+               union
+               {
+                 struct sockaddr_storage ss;
+                 struct sockaddr sa;
+               } sa2;
+               socklen_t sa2len;
 
                s2 = __socket(res0->ai_family, res0->ai_socktype, 0);
                if (s2 < 0) {
@@ -120,23 +129,23 @@ retry:
                }
                __listen(s2, 1);
                sa2len = sizeof (sa2);
-               if (__getsockname(s2, (struct sockaddr *)&sa2, &sa2len) < 0) {
+               if (__getsockname(s2, &sa2.sa, &sa2len) < 0) {
                        perror("getsockname");
                        (void) __close(s2);
                        goto bad;
-               } else if (sa2len != SA_LEN((struct sockaddr *)&sa2)) {
+               } else if (sa2len != SA_LEN(&sa2.sa)) {
                        __set_errno(EINVAL);
                        (void) __close(s2);
                        goto bad;
                }
                port = 0;
-               if (!getnameinfo((struct sockaddr *)&sa2, sa2len,
+               if (!getnameinfo(&sa2.sa, sa2len,
                                 NULL, 0, servbuff, sizeof(servbuff),
                                 NI_NUMERICSERV))
                        port = atoi(servbuff);
                (void) sprintf(num, "%u", port);
                (void) __write(s, num, strlen(num)+1);
-               { int len = sizeof (from);
+               { socklen_t len = sizeof (from);
                  s3 = TEMP_FAILURE_RETRY (accept(s2, (struct sockaddr *)&from,
                                                  &len));
                  __close(s2);