summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKen Raeburn <raeburn@mit.edu>2004-10-06 23:39:12 +0000
committerKen Raeburn <raeburn@mit.edu>2004-10-06 23:39:12 +0000
commit2104847a26d384bb50d474a108c3997c453d5a3d (patch)
treef807455462beaeccf3420ef6c997f2099d1f4a28 /src
parent7da93712765db1b1992ebf87b4abdb766260e747 (diff)
downloadkrb5-2104847a26d384bb50d474a108c3997c453d5a3d.tar.gz
krb5-2104847a26d384bb50d474a108c3997c453d5a3d.tar.xz
krb5-2104847a26d384bb50d474a108c3997c453d5a3d.zip
* localaddr.c (foreach_localaddr): Be more careful not to walk past the end of
the ifreq array. (get_ifreq_array): Return 0 in success case, not errno. git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@16808 dc483132-0cff-0310-8789-dd5450dbe970
Diffstat (limited to 'src')
-rw-r--r--src/lib/krb5/os/ChangeLog4
-rw-r--r--src/lib/krb5/os/localaddr.c15
2 files changed, 13 insertions, 6 deletions
diff --git a/src/lib/krb5/os/ChangeLog b/src/lib/krb5/os/ChangeLog
index a560ac959..1258c9151 100644
--- a/src/lib/krb5/os/ChangeLog
+++ b/src/lib/krb5/os/ChangeLog
@@ -1,5 +1,9 @@
2004-10-06 Ken Raeburn <raeburn@mit.edu>
+ * localaddr.c (foreach_localaddr): Be more careful not to walk
+ past the end of the ifreq array.
+ (get_ifreq_array): Return 0 in success case, not errno.
+
* localaddr.c (get_ifreq_array): Split out from foreach_localaddr
general version.
(foreach_localaddr): Call it.
diff --git a/src/lib/krb5/os/localaddr.c b/src/lib/krb5/os/localaddr.c
index 389a7781e..91324660b 100644
--- a/src/lib/krb5/os/localaddr.c
+++ b/src/lib/krb5/os/localaddr.c
@@ -568,7 +568,7 @@ foreach_localaddr (/*@null@*/ void *data,
goto punt;
}
- for (i = 0; i < P.buf_size; i+= sizeof (*lifr)) {
+ for (i = 0; i + sizeof(*lifr) <= P.buf_size; i+= sizeof (*lifr)) {
lifr = (struct lifreq *)((caddr_t) P.buf+i);
strncpy(lifreq.lifr_name, lifr->lifr_name,
@@ -637,7 +637,7 @@ have_working_socket:
if (pass2fn)
FOREACH_AF ()
if (P.sock >= 0) {
- for (i = 0; i < P.buf_size; i+= sizeof (*lifr)) {
+ for (i = 0; i + sizeof (*lifr) <= P.buf_size; i+= sizeof (*lifr)) {
lifr = (struct lifreq *)((caddr_t) P.buf+i);
if (lifr->lifr_name[0] == '\0')
@@ -740,7 +740,7 @@ foreach_localaddr (/*@null@*/ void *data,
goto punt;
}
- for (i = 0; i < P.buf_size; i+= sizeof (*lifr)) {
+ for (i = 0; i + sizeof(*lifr) <= P.buf_size; i+= sizeof (*lifr)) {
lifr = (struct if_laddrreq *)((caddr_t) P.buf+i);
strncpy(lifreq.iflr_name, lifr->iflr_name,
@@ -809,7 +809,7 @@ have_working_socket:
if (pass2fn)
FOREACH_AF ()
if (P.sock >= 0) {
- for (i = 0; i < P.buf_size; i+= sizeof (*lifr)) {
+ for (i = 0; i + sizeof(*lifr) <= P.buf_size; i+= sizeof (*lifr)) {
lifr = (struct if_laddrreq *)((caddr_t) P.buf+i);
if (lifr->iflr_name[0] == '\0')
@@ -914,7 +914,7 @@ ask_again:
*bufp = buf;
*np = n;
- return errno;
+ return 0;
}
int
@@ -955,8 +955,11 @@ foreach_localaddr (/*@null@*/ void *data,
The Samba mailing list archives mention that NTP looks for the
size on these systems: *-fujitsu-uxp* *-ncr-sysv4*
*-univel-sysv*. */
- for (i = 0; i < n; i+= ifreq_size(*ifr) ) {
+ for (i = 0; i + sizeof(struct ifreq) < n; i+= ifreq_size(*ifr) ) {
ifr = (struct ifreq *)((caddr_t) buf+i);
+ /* In case ifreq_size is more than sizeof(). */
+ if (i + ifreq_size(*ifr) >= n)
+ break;
strncpy(ifreq.ifr_name, ifr->ifr_name, sizeof (ifreq.ifr_name));
Tprintf (("interface %s\n", ifreq.ifr_name));