summaryrefslogtreecommitdiffstats
path: root/src/lib
diff options
context:
space:
mode:
authorSam Hartman <hartmans@mit.edu>1995-07-18 22:00:47 +0000
committerSam Hartman <hartmans@mit.edu>1995-07-18 22:00:47 +0000
commitd4091516be57fb8f76f0880c808a8281f06f1869 (patch)
tree81d48e5782c2cae8c7bdd2d82bdd6bf29b7534cd /src/lib
parent1af820e9d3c8d1d9fb315fd0d2a1b9bf83d42925 (diff)
Bsd 4.4 has a field sa_len in struct sockaddr which is the
length of the struct. Often, sizeof(struct sockaddr) is not equal to sockaddr.sa_len. Unfortunately, this effects the side of structures containing sockaddrs, like struct ifreq. The size of an ifreq is, under BSD 4.4, max(sizeof(struct ifreq), sizeof(ifreq.ifr_name)+ifreq.ifr_caddr.sa_len). To get krb5_xcrypto_os_localaddr to work under NetBSD and other 4.4-based systems, the following changes were made: * aclocal.m4: Ad KRB5_SOCKADDR_SA_LEN to determine if there appears to be a sa_len element of struct sockaddr. * lib/crypto/os/configure.in: use this test * lib/crypto/os/localaddr.c: Deal with size changes if appropriate. git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@6310 dc483132-0cff-0310-8789-dd5450dbe970
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/crypto/os/ChangeLog7
-rw-r--r--src/lib/crypto/os/configure.in1
-rw-r--r--src/lib/crypto/os/localaddr.c21
3 files changed, 26 insertions, 3 deletions
diff --git a/src/lib/crypto/os/ChangeLog b/src/lib/crypto/os/ChangeLog
index c2708b7b1..5dcc23044 100644
--- a/src/lib/crypto/os/ChangeLog
+++ b/src/lib/crypto/os/ChangeLog
@@ -1,3 +1,10 @@
+Mon Jul 17 16:04:00 1995 Sam Hartman <hartmans@tertius.mit.edu>
+
+ * localaddr.c (krb5_crypto_os_localaddr): Deal with variable sized
+ ifreq structures if sockaddr contains sa_len field.
+
+ * configure.in: Check to see if struct sockaddr has sa_len.
+
Thu Jul 6 17:13:11 1995 Tom Yu <tlyu@lothlorien.MIT.EDU>
* localaddr.c: migrated from lib/krb5/os
diff --git a/src/lib/crypto/os/configure.in b/src/lib/crypto/os/configure.in
index 4943ed770..ed9eedf4c 100644
--- a/src/lib/crypto/os/configure.in
+++ b/src/lib/crypto/os/configure.in
@@ -5,4 +5,5 @@ SubdirLibraryRule([${OBJS}])
AC_LN_S
AC_REPLACE_FUNCS(memmove)
AC_HAVE_FUNCS(srand48 srand srandom getpid)
+KRB5_SOCKADDR_SA_LEN
V5_AC_OUTPUT_MAKEFILE
diff --git a/src/lib/crypto/os/localaddr.c b/src/lib/crypto/os/localaddr.c
index 35e370a4a..ddf58181e 100644
--- a/src/lib/crypto/os/localaddr.c
+++ b/src/lib/crypto/os/localaddr.c
@@ -74,6 +74,20 @@
* Add more address families here.
*/
+/*
+ * BSD 4.4 defines the size of an ifreq to be max(sizeof(ifreq), sizeof(ifr.ifr_name)+ifreq.ifr_ifr_addr.sa_len
+ * However, under earlier systems, sa_len isn't present, so the size is
+ * just sizeof(struct ifreq)
+ */
+#ifdef HAVE_SA_LEN
+#define ifreq_size(i) max(sizeof(struct ifreq),\
+ sizeof(i.ifr_name)+i.ifr_addr.sa_len)
+#else
+#define ifreq_size(i) sizeof(struct ifreq)
+#endif /* HAVE_SA_LEN*/
+
+
+
extern int errno;
/*
@@ -112,11 +126,12 @@ krb5_crypto_os_localaddr(addr)
closesocket (s);
return retval;
}
- n = ifc.ifc_len / sizeof (struct ifreq);
+ n = ifc.ifc_len;
- for (n_found=0, i=0; i<n && ! mem_err; i++) {
+n_found = 0;
+ for (i = 0; i < n; i+= ifreq_size(*ifr) ) {
krb5_address *address;
- ifr = &ifc.ifc_req[i];
+ ifr = (struct ifreq *)((caddr_t) ifc.ifc_buf+i);
if (ioctl (s, SIOCGIFFLAGS, (char *)ifr) < 0)
continue;