summaryrefslogtreecommitdiffstats
path: root/crypto/heimdal/lib/krb5/addr_families.c
diff options
context:
space:
mode:
Diffstat (limited to 'crypto/heimdal/lib/krb5/addr_families.c')
-rw-r--r--crypto/heimdal/lib/krb5/addr_families.c134
1 files changed, 74 insertions, 60 deletions
diff --git a/crypto/heimdal/lib/krb5/addr_families.c b/crypto/heimdal/lib/krb5/addr_families.c
index 4343440..0fed2e7 100644
--- a/crypto/heimdal/lib/krb5/addr_families.c
+++ b/crypto/heimdal/lib/krb5/addr_families.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997-2001 Kungliga Tekniska Högskolan
+ * Copyright (c) 1997-2002 Kungliga Tekniska Högskolan
* (Royal Institute of Technology, Stockholm, Sweden).
* All rights reserved.
*
@@ -33,7 +33,7 @@
#include "krb5_locl.h"
-RCSID("$Id: addr_families.c,v 1.32 2001/09/03 19:53:51 assar Exp $");
+RCSID("$Id: addr_families.c,v 1.37 2002/08/19 13:51:37 joda Exp $");
struct addr_operations {
int af;
@@ -42,11 +42,11 @@ struct addr_operations {
krb5_error_code (*sockaddr2addr)(const struct sockaddr *, krb5_address *);
krb5_error_code (*sockaddr2port)(const struct sockaddr *, int16_t *);
void (*addr2sockaddr)(const krb5_address *, struct sockaddr *,
- int *sa_size, int port);
- void (*h_addr2sockaddr)(const char *, struct sockaddr *, int *, int);
+ krb5_socklen_t *sa_size, int port);
+ void (*h_addr2sockaddr)(const char *, struct sockaddr *, krb5_socklen_t *, int);
krb5_error_code (*h_addr2addr)(const char *, krb5_address *);
krb5_boolean (*uninteresting)(const struct sockaddr *);
- void (*anyaddr)(struct sockaddr *, int *, int);
+ void (*anyaddr)(struct sockaddr *, krb5_socklen_t *, int);
int (*print_addr)(const krb5_address *, char *, size_t);
int (*parse_addr)(krb5_context, const char*, krb5_address *);
int (*order_addr)(krb5_context, const krb5_address*, const krb5_address*);
@@ -81,29 +81,33 @@ ipv4_sockaddr2port (const struct sockaddr *sa, int16_t *port)
static void
ipv4_addr2sockaddr (const krb5_address *a,
struct sockaddr *sa,
- int *sa_size,
+ krb5_socklen_t *sa_size,
int port)
{
- struct sockaddr_in *sin = (struct sockaddr_in *)sa;
+ struct sockaddr_in tmp;
- memset (sin, 0, sizeof(*sin));
- sin->sin_family = AF_INET;
- memcpy (&sin->sin_addr, a->address.data, 4);
- sin->sin_port = port;
- *sa_size = sizeof(*sin);
+ memset (&tmp, 0, sizeof(tmp));
+ tmp.sin_family = AF_INET;
+ memcpy (&tmp.sin_addr, a->address.data, 4);
+ tmp.sin_port = port;
+ memcpy(sa, &tmp, min(sizeof(tmp), *sa_size));
+ *sa_size = sizeof(tmp);
}
static void
ipv4_h_addr2sockaddr(const char *addr,
- struct sockaddr *sa, int *sa_size, int port)
+ struct sockaddr *sa,
+ krb5_socklen_t *sa_size,
+ int port)
{
- struct sockaddr_in *sin = (struct sockaddr_in *)sa;
+ struct sockaddr_in tmp;
- memset (sin, 0, sizeof(*sin));
- *sa_size = sizeof(*sin);
- sin->sin_family = AF_INET;
- sin->sin_port = port;
- sin->sin_addr = *((const struct in_addr *)addr);
+ memset (&tmp, 0, sizeof(tmp));
+ tmp.sin_family = AF_INET;
+ tmp.sin_port = port;
+ tmp.sin_addr = *((const struct in_addr *)addr);
+ memcpy(sa, &tmp, min(sizeof(tmp), *sa_size));
+ *sa_size = sizeof(tmp);
}
static krb5_error_code
@@ -133,15 +137,16 @@ ipv4_uninteresting (const struct sockaddr *sa)
}
static void
-ipv4_anyaddr (struct sockaddr *sa, int *sa_size, int port)
+ipv4_anyaddr (struct sockaddr *sa, krb5_socklen_t *sa_size, int port)
{
- struct sockaddr_in *sin = (struct sockaddr_in *)sa;
+ struct sockaddr_in tmp;
- memset (sin, 0, sizeof(*sin));
- *sa_size = sizeof(*sin);
- sin->sin_family = AF_INET;
- sin->sin_port = port;
- sin->sin_addr.s_addr = INADDR_ANY;
+ memset (&tmp, 0, sizeof(tmp));
+ tmp.sin_family = AF_INET;
+ tmp.sin_port = port;
+ tmp.sin_addr.s_addr = INADDR_ANY;
+ memcpy(sa, &tmp, min(sizeof(tmp), *sa_size));
+ *sa_size = sizeof(tmp);
}
static int
@@ -231,31 +236,33 @@ ipv6_sockaddr2port (const struct sockaddr *sa, int16_t *port)
static void
ipv6_addr2sockaddr (const krb5_address *a,
struct sockaddr *sa,
- int *sa_size,
+ krb5_socklen_t *sa_size,
int port)
{
- struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa;
+ struct sockaddr_in6 tmp;
- memset (sin6, 0, sizeof(*sin6));
- sin6->sin6_family = AF_INET6;
- memcpy (&sin6->sin6_addr, a->address.data, sizeof(sin6->sin6_addr));
- sin6->sin6_port = port;
- *sa_size = sizeof(*sin6);
+ memset (&tmp, 0, sizeof(tmp));
+ tmp.sin6_family = AF_INET6;
+ memcpy (&tmp.sin6_addr, a->address.data, sizeof(tmp.sin6_addr));
+ tmp.sin6_port = port;
+ memcpy(sa, &tmp, min(sizeof(tmp), *sa_size));
+ *sa_size = sizeof(tmp);
}
static void
ipv6_h_addr2sockaddr(const char *addr,
struct sockaddr *sa,
- int *sa_size,
+ krb5_socklen_t *sa_size,
int port)
{
- struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa;
+ struct sockaddr_in6 tmp;
- memset (sin6, 0, sizeof(*sin6));
- *sa_size = sizeof(*sin6);
- sin6->sin6_family = AF_INET6;
- sin6->sin6_port = port;
- sin6->sin6_addr = *((const struct in6_addr *)addr);
+ memset (&tmp, 0, sizeof(tmp));
+ tmp.sin6_family = AF_INET6;
+ tmp.sin6_port = port;
+ tmp.sin6_addr = *((const struct in6_addr *)addr);
+ memcpy(sa, &tmp, min(sizeof(tmp), *sa_size));
+ *sa_size = sizeof(tmp);
}
static krb5_error_code
@@ -282,15 +289,15 @@ ipv6_uninteresting (const struct sockaddr *sa)
}
static void
-ipv6_anyaddr (struct sockaddr *sa, int *sa_size, int port)
+ipv6_anyaddr (struct sockaddr *sa, krb5_socklen_t *sa_size, int port)
{
- struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa;
+ struct sockaddr_in6 tmp;
- memset (sin6, 0, sizeof(*sin6));
- *sa_size = sizeof(*sin6);
- sin6->sin6_family = AF_INET6;
- sin6->sin6_port = port;
- sin6->sin6_addr = in6addr_any;
+ memset (&tmp, 0, sizeof(tmp));
+ tmp.sin6_family = AF_INET6;
+ tmp.sin6_port = port;
+ tmp.sin6_addr = in6addr_any;
+ *sa_size = sizeof(tmp);
}
static int
@@ -358,7 +365,7 @@ struct arange {
static int
arange_parse_addr (krb5_context context,
- const char *address, krb5_address *addr)
+ const char *address, krb5_address *addr)
{
char buf[1024];
krb5_addresses low, high;
@@ -471,8 +478,8 @@ arange_print_addr (const krb5_address *addr, char *str, size_t len)
static int
arange_order_addr(krb5_context context,
- const krb5_address *addr1,
- const krb5_address *addr2)
+ const krb5_address *addr1,
+ const krb5_address *addr2)
{
int tmp1, tmp2, sign;
struct arange *a;
@@ -594,7 +601,7 @@ krb5_error_code
krb5_addr2sockaddr (krb5_context context,
const krb5_address *addr,
struct sockaddr *sa,
- int *sa_size,
+ krb5_socklen_t *sa_size,
int port)
{
struct addr_operations *a = find_atype(addr->addr_type);
@@ -637,7 +644,8 @@ krb5_sockaddr_uninteresting(const struct sockaddr *sa)
krb5_error_code
krb5_h_addr2sockaddr (krb5_context context,
int af,
- const char *addr, struct sockaddr *sa, int *sa_size,
+ const char *addr, struct sockaddr *sa,
+ krb5_socklen_t *sa_size,
int port)
{
struct addr_operations *a = find_af(af);
@@ -666,7 +674,7 @@ krb5_error_code
krb5_anyaddr (krb5_context context,
int af,
struct sockaddr *sa,
- int *sa_size,
+ krb5_socklen_t *sa_size,
int port)
{
struct addr_operations *a = find_af (af);
@@ -684,6 +692,7 @@ krb5_error_code
krb5_print_address (const krb5_address *addr,
char *str, size_t len, size_t *ret_len)
{
+ size_t ret;
struct addr_operations *a = find_atype(addr->addr_type);
if (a == NULL) {
@@ -704,10 +713,13 @@ krb5_print_address (const krb5_address *addr,
len -= l;
s += l;
}
- *ret_len = s - str;
+ if(ret_len != NULL)
+ *ret_len = s - str;
return 0;
}
- *ret_len = (*a->print_addr)(addr, str, len);
+ ret = (*a->print_addr)(addr, str, len);
+ if(ret_len != NULL)
+ *ret_len = ret;
return 0;
}
@@ -723,10 +735,10 @@ krb5_parse_address(krb5_context context,
for(i = 0; i < num_addrs; i++) {
if(at[i].parse_addr) {
- krb5_address a;
- if((*at[i].parse_addr)(context, string, &a) == 0) {
+ krb5_address addr;
+ if((*at[i].parse_addr)(context, string, &addr) == 0) {
ALLOC_SEQ(addresses, 1);
- addresses->val[0] = a;
+ addresses->val[0] = addr;
return 0;
}
}
@@ -745,8 +757,10 @@ krb5_parse_address(krb5_context context,
ALLOC_SEQ(addresses, n);
- for (a = ai, i = 0; a != NULL; a = a->ai_next, ++i) {
- krb5_sockaddr2address (context, ai->ai_addr, &addresses->val[i]);
+ for (a = ai, i = 0; a != NULL; a = a->ai_next) {
+ if(krb5_sockaddr2address (context, ai->ai_addr,
+ &addresses->val[i]) == 0)
+ i++;
}
freeaddrinfo (ai);
return 0;
OpenPOWER on IntegriCloud