(*): simplify by using `struct sockaddr_storage'
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@6524 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -172,37 +172,29 @@ static void
|
|||||||
init_socket(struct descr *d, krb5_address *a, int family, int type, int port)
|
init_socket(struct descr *d, krb5_address *a, int family, int type, int port)
|
||||||
{
|
{
|
||||||
krb5_error_code ret;
|
krb5_error_code ret;
|
||||||
struct sockaddr *sa;
|
struct sockaddr_storage __ss;
|
||||||
void *sa_buf;
|
struct sockaddr *sa = (struct sockaddr *)&__ss;
|
||||||
int sa_size;
|
int sa_size;
|
||||||
|
|
||||||
memset(d, 0, sizeof(*d));
|
memset(d, 0, sizeof(*d));
|
||||||
d->s = -1;
|
d->s = -1;
|
||||||
|
|
||||||
sa_size = krb5_max_sockaddr_size ();
|
|
||||||
sa_buf = malloc(sa_size);
|
|
||||||
if (sa_buf == NULL) {
|
|
||||||
kdc_log(0, "Failed to allocate %u bytes", sa_size);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
sa = (struct sockaddr *)sa_buf;
|
|
||||||
|
|
||||||
ret = krb5_addr2sockaddr (a, sa, &sa_size, port);
|
ret = krb5_addr2sockaddr (a, sa, &sa_size, port);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
krb5_warn(context, ret, "krb5_anyaddr");
|
krb5_warn(context, ret, "krb5_anyaddr");
|
||||||
close(d->s);
|
close(d->s);
|
||||||
d->s = -1;
|
d->s = -1;
|
||||||
goto out;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sa->sa_family != family)
|
if (sa->sa_family != family)
|
||||||
goto out;
|
return;
|
||||||
|
|
||||||
d->s = socket(family, type, 0);
|
d->s = socket(family, type, 0);
|
||||||
if(d->s < 0){
|
if(d->s < 0){
|
||||||
krb5_warn(context, errno, "socket(%d, %d, 0)", family, type);
|
krb5_warn(context, errno, "socket(%d, %d, 0)", family, type);
|
||||||
d->s = -1;
|
d->s = -1;
|
||||||
goto out;
|
return;
|
||||||
}
|
}
|
||||||
#if defined(HAVE_SETSOCKOPT) && defined(SOL_SOCKET) && defined(SO_REUSEADDR)
|
#if defined(HAVE_SETSOCKOPT) && defined(SOL_SOCKET) && defined(SO_REUSEADDR)
|
||||||
{
|
{
|
||||||
@@ -216,15 +208,13 @@ init_socket(struct descr *d, krb5_address *a, int family, int type, int port)
|
|||||||
krb5_warn(context, errno, "bind(%d)", ntohs(port));
|
krb5_warn(context, errno, "bind(%d)", ntohs(port));
|
||||||
close(d->s);
|
close(d->s);
|
||||||
d->s = -1;
|
d->s = -1;
|
||||||
goto out;
|
return;
|
||||||
}
|
}
|
||||||
if(type == SOCK_STREAM && listen(d->s, SOMAXCONN) < 0){
|
if(type == SOCK_STREAM && listen(d->s, SOMAXCONN) < 0){
|
||||||
krb5_warn(context, errno, "listen");
|
krb5_warn(context, errno, "listen");
|
||||||
close(d->s);
|
close(d->s);
|
||||||
d->s = -1;
|
return;
|
||||||
}
|
}
|
||||||
out:
|
|
||||||
free (sa_buf);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -379,41 +369,30 @@ static void
|
|||||||
handle_udp(struct descr *d)
|
handle_udp(struct descr *d)
|
||||||
{
|
{
|
||||||
unsigned char *buf;
|
unsigned char *buf;
|
||||||
struct sockaddr *sa;
|
struct sockaddr_storage __ss;
|
||||||
void *sa_buf;
|
struct sockaddr *sa = (struct sockaddr *)&__ss;
|
||||||
int sa_size;
|
|
||||||
int from_len;
|
int from_len;
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
sa_size = krb5_max_sockaddr_size ();
|
|
||||||
sa_buf = malloc(sa_size);
|
|
||||||
if (sa_buf == NULL) {
|
|
||||||
kdc_log(0, "Failed to allocate %u bytes", sa_size);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
sa = (struct sockaddr *)sa_buf;
|
|
||||||
|
|
||||||
buf = malloc(max_request);
|
buf = malloc(max_request);
|
||||||
if(buf == NULL){
|
if(buf == NULL){
|
||||||
kdc_log(0, "Failed to allocate %u bytes", max_request);
|
kdc_log(0, "Failed to allocate %u bytes", max_request);
|
||||||
free (sa_buf);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
from_len = sa_size;
|
from_len = sizeof(__ss);
|
||||||
n = recvfrom(d->s, buf, max_request, 0,
|
n = recvfrom(d->s, buf, max_request, 0,
|
||||||
sa, &from_len);
|
sa, &from_len);
|
||||||
if(n < 0){
|
if(n < 0){
|
||||||
krb5_warn(context, errno, "recvfrom");
|
krb5_warn(context, errno, "recvfrom");
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
if(n == 0){
|
if(n == 0) {
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
do_request(buf, n, 0, d->s, sa, from_len);
|
do_request(buf, n, 0, d->s, sa, from_len);
|
||||||
out:
|
out:
|
||||||
free (buf);
|
free (buf);
|
||||||
free (sa_buf);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -456,36 +435,25 @@ de_http(char *buf)
|
|||||||
static void
|
static void
|
||||||
add_new_tcp (struct descr *d, int index, int min_free)
|
add_new_tcp (struct descr *d, int index, int min_free)
|
||||||
{
|
{
|
||||||
size_t sa_size;
|
struct sockaddr_storage __ss;
|
||||||
char *sa_buf;
|
struct sockaddr *sa = (struct sockaddr *)&__ss;
|
||||||
struct sockaddr *sa;
|
|
||||||
int s;
|
int s;
|
||||||
int from_len;
|
int from_len;
|
||||||
|
|
||||||
sa_size = krb5_max_sockaddr_size ();
|
from_len = sizeof(__ss);
|
||||||
sa_buf = malloc(sa_size);
|
|
||||||
if (sa_buf == NULL) {
|
|
||||||
kdc_log(0, "Failed to allocate %u bytes", sa_size);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
sa = (struct sockaddr *)sa_buf;
|
|
||||||
|
|
||||||
from_len = sa_size;
|
|
||||||
s = accept(d[index].s, sa, &from_len);
|
s = accept(d[index].s, sa, &from_len);
|
||||||
if(s < 0){
|
if(s < 0){
|
||||||
krb5_warn(context, errno, "accept");
|
krb5_warn(context, errno, "accept");
|
||||||
goto out;
|
return;
|
||||||
}
|
}
|
||||||
if(min_free == -1){
|
if(min_free == -1){
|
||||||
close(s);
|
close(s);
|
||||||
goto out;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
d[min_free].s = s;
|
d[min_free].s = s;
|
||||||
d[min_free].timeout = time(NULL) + TCP_TIMEOUT;
|
d[min_free].timeout = time(NULL) + TCP_TIMEOUT;
|
||||||
d[min_free].type = SOCK_STREAM;
|
d[min_free].type = SOCK_STREAM;
|
||||||
out:
|
|
||||||
free (sa);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -636,9 +604,8 @@ handle_tcp(struct descr *d, int index, int min_free)
|
|||||||
{
|
{
|
||||||
unsigned char buf[1024];
|
unsigned char buf[1024];
|
||||||
char addr[32];
|
char addr[32];
|
||||||
void *sa_buf;
|
struct sockaddr_storage __ss;
|
||||||
struct sockaddr *sa;
|
struct sockaddr *sa = (struct sockaddr *)&__ss;
|
||||||
int sa_size;
|
|
||||||
int from_len;
|
int from_len;
|
||||||
int n;
|
int n;
|
||||||
int ret;
|
int ret;
|
||||||
@@ -648,14 +615,6 @@ handle_tcp(struct descr *d, int index, int min_free)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
sa_size = krb5_max_sockaddr_size ();
|
|
||||||
sa_buf = malloc(sa_size);
|
|
||||||
if (sa_buf == NULL) {
|
|
||||||
kdc_log(0, "Failed to allocate %u bytes", sa_size);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
sa = (struct sockaddr *)sa_buf;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We can't trust recvfrom to return an address so we always call
|
* We can't trust recvfrom to return an address so we always call
|
||||||
* getpeername.
|
* getpeername.
|
||||||
@@ -664,16 +623,16 @@ handle_tcp(struct descr *d, int index, int min_free)
|
|||||||
n = recvfrom(d[index].s, buf, sizeof(buf), 0, NULL, NULL);
|
n = recvfrom(d[index].s, buf, sizeof(buf), 0, NULL, NULL);
|
||||||
if(n < 0){
|
if(n < 0){
|
||||||
krb5_warn(context, errno, "recvfrom");
|
krb5_warn(context, errno, "recvfrom");
|
||||||
goto out;
|
return;
|
||||||
}
|
}
|
||||||
from_len = sa_size;
|
from_len = sizeof(__ss);
|
||||||
if (getpeername(d[index].s, sa, &from_len) < 0) {
|
if (getpeername(d[index].s, sa, &from_len) < 0) {
|
||||||
krb5_warn(context, errno, "getpeername");
|
krb5_warn(context, errno, "getpeername");
|
||||||
goto out;
|
return;
|
||||||
}
|
}
|
||||||
addr_to_string(sa, from_len, addr, sizeof(addr));
|
addr_to_string(sa, from_len, addr, sizeof(addr));
|
||||||
if (grow_descr (&d[index], n))
|
if (grow_descr (&d[index], n))
|
||||||
goto out;
|
return;
|
||||||
memcpy(d[index].buf + d[index].len, buf, n);
|
memcpy(d[index].buf + d[index].len, buf, n);
|
||||||
d[index].len += n;
|
d[index].len += n;
|
||||||
if(d[index].len > 4 && d[index].buf[0] == 0) {
|
if(d[index].len > 4 && d[index].buf[0] == 0) {
|
||||||
@@ -688,17 +647,15 @@ handle_tcp(struct descr *d, int index, int min_free)
|
|||||||
clear_descr (d + index);
|
clear_descr (d + index);
|
||||||
} else {
|
} else {
|
||||||
kdc_log (0, "TCP data of strange type from %s", addr);
|
kdc_log (0, "TCP data of strange type from %s", addr);
|
||||||
goto out;
|
return;
|
||||||
}
|
}
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto out;
|
return;
|
||||||
else if (ret == 1) {
|
else if (ret == 1) {
|
||||||
do_request(d[index].buf, d[index].len, 1,
|
do_request(d[index].buf, d[index].len, 1,
|
||||||
d[index].s, sa, from_len);
|
d[index].s, sa, from_len);
|
||||||
clear_descr(d + index);
|
clear_descr(d + index);
|
||||||
}
|
}
|
||||||
out:
|
|
||||||
free (sa_buf);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@@ -533,15 +533,8 @@ doit (int port)
|
|||||||
krb5_addresses addrs;
|
krb5_addresses addrs;
|
||||||
unsigned n, i;
|
unsigned n, i;
|
||||||
fd_set real_fdset;
|
fd_set real_fdset;
|
||||||
void *sa_buf;
|
struct sockaddr_storage __ss;
|
||||||
int sa_max_size;
|
struct sockaddr *sa = (struct sockaddr *)&__ss;
|
||||||
struct sockaddr *sa;
|
|
||||||
|
|
||||||
sa_max_size = krb5_max_sockaddr_size ();
|
|
||||||
sa_buf = malloc (sa_max_size);
|
|
||||||
if (sa_buf == NULL)
|
|
||||||
krb5_errx (context, 1, "out of memory");
|
|
||||||
sa = (struct sockaddr *)sa_buf;
|
|
||||||
|
|
||||||
ret = krb5_get_default_realm (context, &realm);
|
ret = krb5_get_default_realm (context, &realm);
|
||||||
if (ret)
|
if (ret)
|
||||||
@@ -598,7 +591,7 @@ doit (int port)
|
|||||||
for (i = 0; i < n; ++i)
|
for (i = 0; i < n; ++i)
|
||||||
if (FD_ISSET(sockets[i], &fdset)) {
|
if (FD_ISSET(sockets[i], &fdset)) {
|
||||||
u_char buf[BUFSIZ];
|
u_char buf[BUFSIZ];
|
||||||
int addrlen = sa_max_size;
|
int addrlen = sizeof(__ss);
|
||||||
|
|
||||||
ret = recvfrom (sockets[i], buf, sizeof(buf), 0,
|
ret = recvfrom (sockets[i], buf, sizeof(buf), 0,
|
||||||
sa, &addrlen);
|
sa, &addrlen);
|
||||||
@@ -618,7 +611,6 @@ doit (int port)
|
|||||||
krb5_free_addresses (context, &addrs);
|
krb5_free_addresses (context, &addrs);
|
||||||
krb5_free_principal (context, server);
|
krb5_free_principal (context, server);
|
||||||
krb5_free_context (context);
|
krb5_free_context (context);
|
||||||
free (sa_buf);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user