more consitity check, remove dead code, add socket length code, add
missing break, make diffrent chars of type type files for case-insensitiv filesystems git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@18402 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -154,8 +154,8 @@
|
|||||||
#define SOCKET_FORMAT "%c%02X%04X"
|
#define SOCKET_FORMAT "%c%02X%04X"
|
||||||
#define SOCKET_TYPE_CHAR_TCP 'T'
|
#define SOCKET_TYPE_CHAR_TCP 'T'
|
||||||
#define SOCKET_TYPE_CHAR_UDP 'U'
|
#define SOCKET_TYPE_CHAR_UDP 'U'
|
||||||
#define SOCKET_TYPE_CHAR_TCP_V6 't'
|
#define SOCKET_TYPE_CHAR_TCP_V6 'X'
|
||||||
#define SOCKET_TYPE_CHAR_UDP_V6 'u'
|
#define SOCKET_TYPE_CHAR_UDP_V6 'Y'
|
||||||
|
|
||||||
#define MAX_WRAPPED_INTERFACES 16
|
#define MAX_WRAPPED_INTERFACES 16
|
||||||
|
|
||||||
@@ -182,6 +182,21 @@ static void set_port(int family, int prt, struct sockaddr *addr)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int socket_length(int family)
|
||||||
|
{
|
||||||
|
switch (family) {
|
||||||
|
case AF_INET:
|
||||||
|
return sizeof(struct sockaddr_in);
|
||||||
|
#ifdef HAVE_IPV6
|
||||||
|
case AF_INET6:
|
||||||
|
return sizeof(struct sockaddr_in6);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
struct socket_info
|
struct socket_info
|
||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
@@ -467,6 +482,7 @@ static int convert_in_un_alloc(struct socket_info *si, const struct sockaddr *in
|
|||||||
errno = EADDRNOTAVAIL;
|
errno = EADDRNOTAVAIL;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
#ifdef HAVE_IPV6
|
#ifdef HAVE_IPV6
|
||||||
case AF_INET6: {
|
case AF_INET6: {
|
||||||
@@ -564,23 +580,16 @@ static int sockaddr_convert_from_un(const struct socket_info *si,
|
|||||||
socklen_t un_addrlen,
|
socklen_t un_addrlen,
|
||||||
int family,
|
int family,
|
||||||
struct sockaddr *out_addr,
|
struct sockaddr *out_addr,
|
||||||
socklen_t *_out_addrlen)
|
socklen_t *out_addrlen)
|
||||||
{
|
{
|
||||||
socklen_t out_addrlen;
|
if (out_addr == NULL || out_addrlen == NULL)
|
||||||
|
|
||||||
if (out_addr == NULL || _out_addrlen == NULL)
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (un_addrlen == 0) {
|
if (un_addrlen == 0) {
|
||||||
*_out_addrlen = 0;
|
*out_addrlen = 0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
out_addrlen = *_out_addrlen;
|
|
||||||
if (out_addrlen > un_addrlen) {
|
|
||||||
out_addrlen = un_addrlen;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (family) {
|
switch (family) {
|
||||||
case AF_INET:
|
case AF_INET:
|
||||||
#ifdef HAVE_IPV6
|
#ifdef HAVE_IPV6
|
||||||
@@ -594,7 +603,7 @@ static int sockaddr_convert_from_un(const struct socket_info *si,
|
|||||||
errno = ESOCKTNOSUPPORT;
|
errno = ESOCKTNOSUPPORT;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return convert_un_in(in_addr, out_addr, _out_addrlen);
|
return convert_un_in(in_addr, out_addr, out_addrlen);
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1252,7 +1261,7 @@ _PUBLIC_ int swrap_accept(int s, struct sockaddr *addr, socklen_t *addrlen)
|
|||||||
struct sockaddr_un un_my_addr;
|
struct sockaddr_un un_my_addr;
|
||||||
socklen_t un_my_addrlen = sizeof(un_my_addr);
|
socklen_t un_my_addrlen = sizeof(un_my_addr);
|
||||||
struct sockaddr *my_addr;
|
struct sockaddr *my_addr;
|
||||||
socklen_t my_addrlen;
|
socklen_t my_addrlen, len;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
parent_si = find_socket_info(s);
|
parent_si = find_socket_info(s);
|
||||||
@@ -1260,18 +1269,37 @@ _PUBLIC_ int swrap_accept(int s, struct sockaddr *addr, socklen_t *addrlen)
|
|||||||
return real_accept(s, addr, addrlen);
|
return real_accept(s, addr, addrlen);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* assume out sockaddr have the same size as the in parent
|
||||||
|
* socket family
|
||||||
|
*/
|
||||||
|
my_addrlen = socket_length(parent_si->family);
|
||||||
|
if (my_addrlen < 0) {
|
||||||
|
errno = EINVAL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
my_addr = malloc(my_addrlen);
|
||||||
|
if (my_addr == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
memset(&un_addr, 0, sizeof(un_addr));
|
memset(&un_addr, 0, sizeof(un_addr));
|
||||||
memset(&un_my_addr, 0, sizeof(un_my_addr));
|
memset(&un_my_addr, 0, sizeof(un_my_addr));
|
||||||
memset(&my_addr, 0, sizeof(my_addr));
|
|
||||||
|
|
||||||
ret = real_accept(s, (struct sockaddr *)&un_addr, &un_addrlen);
|
ret = real_accept(s, (struct sockaddr *)&un_addr, &un_addrlen);
|
||||||
if (ret == -1) return ret;
|
if (ret == -1) {
|
||||||
|
free(my_addr);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
fd = ret;
|
fd = ret;
|
||||||
|
|
||||||
|
len = my_addrlen;
|
||||||
ret = sockaddr_convert_from_un(parent_si, &un_addr, un_addrlen,
|
ret = sockaddr_convert_from_un(parent_si, &un_addr, un_addrlen,
|
||||||
parent_si->family, addr, addrlen);
|
parent_si->family, my_addr, &len);
|
||||||
if (ret == -1) {
|
if (ret == -1) {
|
||||||
|
free(my_addr);
|
||||||
close(fd);
|
close(fd);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -1286,6 +1314,16 @@ _PUBLIC_ int swrap_accept(int s, struct sockaddr *addr, socklen_t *addrlen)
|
|||||||
child_si->bound = 1;
|
child_si->bound = 1;
|
||||||
child_si->is_server = 1;
|
child_si->is_server = 1;
|
||||||
|
|
||||||
|
child_si->peername_len = len;
|
||||||
|
child_si->peername = sockaddr_dup(my_addr, len);
|
||||||
|
|
||||||
|
if (addr != NULL && addrlen != NULL) {
|
||||||
|
*addrlen = len;
|
||||||
|
if (*addrlen >= len)
|
||||||
|
memcpy(addr, my_addr, len);
|
||||||
|
*addrlen = 0;
|
||||||
|
}
|
||||||
|
|
||||||
ret = real_getsockname(fd, (struct sockaddr *)&un_my_addr, &un_my_addrlen);
|
ret = real_getsockname(fd, (struct sockaddr *)&un_my_addr, &un_my_addrlen);
|
||||||
if (ret == -1) {
|
if (ret == -1) {
|
||||||
free(child_si);
|
free(child_si);
|
||||||
@@ -1293,16 +1331,9 @@ _PUBLIC_ int swrap_accept(int s, struct sockaddr *addr, socklen_t *addrlen)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
my_addrlen = *addrlen;
|
len = my_addrlen;
|
||||||
my_addr = malloc(my_addrlen);
|
|
||||||
if (my_addr == NULL) {
|
|
||||||
free(child_si);
|
|
||||||
close(fd);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = sockaddr_convert_from_un(child_si, &un_my_addr, un_my_addrlen,
|
ret = sockaddr_convert_from_un(child_si, &un_my_addr, un_my_addrlen,
|
||||||
child_si->family, my_addr, &my_addrlen);
|
child_si->family, my_addr, &len);
|
||||||
if (ret == -1) {
|
if (ret == -1) {
|
||||||
free(child_si);
|
free(child_si);
|
||||||
free(my_addr);
|
free(my_addr);
|
||||||
@@ -1310,13 +1341,10 @@ _PUBLIC_ int swrap_accept(int s, struct sockaddr *addr, socklen_t *addrlen)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
child_si->myname_len = my_addrlen;
|
child_si->myname_len = len;
|
||||||
child_si->myname = sockaddr_dup(my_addr, my_addrlen);
|
child_si->myname = sockaddr_dup(my_addr, len);
|
||||||
free(my_addr);
|
free(my_addr);
|
||||||
|
|
||||||
child_si->peername_len = *addrlen;
|
|
||||||
child_si->peername = sockaddr_dup(addr, *addrlen);
|
|
||||||
|
|
||||||
SWRAP_DLIST_ADD(sockets, child_si);
|
SWRAP_DLIST_ADD(sockets, child_si);
|
||||||
|
|
||||||
swrap_dump_packet(child_si, addr, SWRAP_ACCEPT_SEND, NULL, 0);
|
swrap_dump_packet(child_si, addr, SWRAP_ACCEPT_SEND, NULL, 0);
|
||||||
@@ -1450,6 +1478,11 @@ _PUBLIC_ int swrap_connect(int s, const struct sockaddr *serv_addr, socklen_t ad
|
|||||||
if (ret == -1) return -1;
|
if (ret == -1) return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (si->family != serv_addr->sa_family) {
|
||||||
|
errno = EINVAL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
ret = sockaddr_convert_to_un(si, (const struct sockaddr *)serv_addr, addrlen, &un_addr, 0, NULL);
|
ret = sockaddr_convert_to_un(si, (const struct sockaddr *)serv_addr, addrlen, &un_addr, 0, NULL);
|
||||||
if (ret == -1) return -1;
|
if (ret == -1) return -1;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user