diff options
-rw-r--r-- | Xtranssock.c | 65 |
1 files changed, 25 insertions, 40 deletions
diff --git a/Xtranssock.c b/Xtranssock.c index 6cde146..d11a654 100644 --- a/Xtranssock.c +++ b/Xtranssock.c @@ -479,7 +479,8 @@ TRANS(SocketReopen) (int i _X_UNUSED, int type, int fd, char *port) XtransConnInfo ciptr; int portlen; struct sockaddr *addr; - size_t addrlen; + struct sockaddr_storage socket_name; + socklen_t socket_name_size; prmsg (3,"SocketReopen(%d,%d,%s)\n", type, fd, port); @@ -488,62 +489,46 @@ TRANS(SocketReopen) (int i _X_UNUSED, int type, int fd, char *port) return NULL; } - portlen = strlen(port) + 1; // include space for trailing null -#ifdef SOCK_MAXADDRLEN - if (portlen < 0 || portlen > (SOCK_MAXADDRLEN + 2)) { - prmsg (1, "SocketReopen: invalid portlen %d\n", portlen); - return NULL; - } - if (portlen < 14) portlen = 14; -#else - if (portlen < 0 || portlen > 14) { - prmsg (1, "SocketReopen: invalid portlen %d\n", portlen); - return NULL; - } -#endif /*SOCK_MAXADDRLEN*/ - if ((ciptr = calloc (1, sizeof(struct _XtransConnInfo))) == NULL) { prmsg (1, "SocketReopen: malloc(ciptr) failed\n"); return NULL; } + socket_name_size = sizeof(socket_name); + if (getsockname(fd, (struct sockaddr*) &socket_name, &socket_name_size) < 0) { + prmsg (1, "SocketReopen: getsockname failed\n"); + return NULL; + } + ciptr->fd = fd; + ciptr->family = AF_UNIX; - addrlen = portlen + offsetof(struct sockaddr, sa_data); - if ((addr = calloc (1, addrlen)) == NULL) { + if ((ciptr->addr = calloc (1, socket_name_size)) < 0) { prmsg (1, "SocketReopen: malloc(addr) failed\n"); free (ciptr); - return NULL; + return NULL; } - ciptr->addr = (char *) addr; - ciptr->addrlen = addrlen; - if ((ciptr->peeraddr = calloc (1, addrlen)) == NULL) { - prmsg (1, "SocketReopen: malloc(portaddr) failed\n"); - free (addr); + if ((ciptr->peeraddr = calloc (1, socket_name_size)) == NULL) { + prmsg (1, "SocketReopen: malloc(peeraddr) failed\n"); + free (ciptr->addr); free (ciptr); return NULL; } - ciptr->peeraddrlen = addrlen; - /* Initialize ciptr structure as if it were a normally-opened unix socket */ - ciptr->flags = TRANS_LOCAL | TRANS_NOUNLINK; -#ifdef BSD44SOCKETS - addr->sa_len = addrlen; -#endif - addr->sa_family = AF_UNIX; -#ifdef HAS_STRLCPY - strlcpy(addr->sa_data, port, portlen); -#else - strncpy(addr->sa_data, port, portlen); -#endif - ciptr->family = AF_UNIX; - memcpy(ciptr->peeraddr, ciptr->addr, addrlen); - ciptr->port = rindex(addr->sa_data, ':'); + memcpy (ciptr->addr, &socket_name, socket_name_size); + memcpy (ciptr->peeraddr, &socket_name, socket_name_size); + + ciptr->addrlen = socket_name_size; + ciptr->peeraddrlen = socket_name_size; + + /* FIXME: Leak */ + port = strdup (port); + ciptr->port = rindex(port, ':'); if (ciptr->port == NULL) { - if (is_numeric(addr->sa_data)) { - ciptr->port = addr->sa_data; + if (is_numeric(port)) { + ciptr->port = port; } } else if (ciptr->port[0] == ':') { ciptr->port++; |