From bdb384fe261a54fc8dacf4b0afa20c9c1ade4602 Mon Sep 17 00:00:00 2001 From: itojun Date: Mon, 28 Feb 2000 07:14:05 +0000 Subject: [PATCH] don't assume CMSG_xx are constant (sync with latest kame) --- usr.sbin/pim6sd/mld6.c | 20 +++++++++++++------- usr.sbin/pim6sd/pim6.c | 36 +++++++++++++++++++++++------------- 2 files changed, 36 insertions(+), 20 deletions(-) diff --git a/usr.sbin/pim6sd/mld6.c b/usr.sbin/pim6sd/mld6.c index eee74751f630..6dccb532f56c 100644 --- a/usr.sbin/pim6sd/mld6.c +++ b/usr.sbin/pim6sd/mld6.c @@ -1,4 +1,4 @@ -/* $NetBSD: mld6.c,v 1.2 2000/02/03 06:59:35 itojun Exp $ */ +/* $NetBSD: mld6.c,v 1.3 2000/02/28 07:14:05 itojun Exp $ */ /* * Copyright (C) 1998 WIDE Project. @@ -118,8 +118,9 @@ static struct msghdr sndmh, static struct iovec sndiov[2]; static struct iovec rcviov[2]; static struct sockaddr_in6 from; -static u_char rcvcmsgbuf[CMSG_SPACE(sizeof(struct in6_pktinfo)) + - CMSG_SPACE(sizeof(int))]; +static u_char *rcvcmsgbuf = NULL; +static int rcvcmsglen; + #ifndef USE_RFC2292BIS u_int8_t raopt[IP6OPT_RTALERT_LEN]; #endif @@ -149,10 +150,15 @@ init_mld6() rtalert_code = htons(IP6OPT_RTALERT_MLD); if (!mld6_recv_buf && (mld6_recv_buf = malloc(RECV_BUF_SIZE)) == NULL) - log(LOG_ERR, 0, "malloca failed"); + log(LOG_ERR, 0, "malloc failed"); if (!mld6_send_buf && (mld6_send_buf = malloc(RECV_BUF_SIZE)) == NULL) - log(LOG_ERR, 0, "malloca failed"); + log(LOG_ERR, 0, "malloc failed"); + rcvcmsglen = CMSG_SPACE(sizeof(struct in6_pktinfo)) + + CMSG_SPACE(sizeof(int)); + if (rcvcmsgbuf == NULL && (rcvcmsgbuf = malloc(rcvcmsglen)) == NULL) + log(LOG_ERR, 0,"malloc failed"); + IF_DEBUG(DEBUG_KERN) log(LOG_DEBUG,0,"%d octets allocated for the emit/recept buffer mld6",RECV_BUF_SIZE); @@ -213,7 +219,7 @@ init_mld6() rcvmh.msg_iov = rcviov; rcvmh.msg_iovlen = 1; rcvmh.msg_control = (caddr_t) rcvcmsgbuf; - rcvmh.msg_controllen = sizeof(rcvcmsgbuf); + rcvmh.msg_controllen = rcvcmsglen; /* initialize msghdr for sending packets */ sndiov[0].iov_base = (caddr_t)mld6_send_buf; @@ -277,7 +283,7 @@ int recvlen; */ if (rcvmh.msg_controllen == 0) { /* XXX: msg_controllen must be reset in this case. */ - rcvmh.msg_controllen = sizeof(rcvcmsgbuf); + rcvmh.msg_controllen = rcvcmsglen; process_kernel_call(); return; diff --git a/usr.sbin/pim6sd/pim6.c b/usr.sbin/pim6sd/pim6.c index 56a78ce02f95..71197dce79ed 100644 --- a/usr.sbin/pim6sd/pim6.c +++ b/usr.sbin/pim6sd/pim6.c @@ -1,4 +1,4 @@ -/* $NetBSD: pim6.c,v 1.1 2000/01/28 19:32:49 itojun Exp $ */ +/* $NetBSD: pim6.c,v 1.2 2000/02/28 07:14:05 itojun Exp $ */ /* * Copyright (C) 1999 LSIIT Laboratory. @@ -106,8 +106,10 @@ static struct iovec sndiovpim[2]; static struct iovec rcviovpim[2]; static struct msghdr sndmhpim, rcvmhpim; -static u_char sndcmsgbufpim[CMSG_SPACE(sizeof(struct in6_pktinfo))]; -static u_char rcvcmsgbufpim[CMSG_SPACE(sizeof(struct in6_pktinfo))]; +static u_char *sndcmsgbufpim = NULL; +static int sndcmsglen; +static u_char *rcvcmsgbufpim = NULL; +static int rcvcmsglen; /* @@ -120,7 +122,8 @@ static int pim6_cksum __P((u_short *, struct in6_addr *, -void init_pim6() +void +init_pim6() { struct cmsghdr *cmsgp; int on; @@ -171,19 +174,26 @@ void init_pim6() rcvmhpim.msg_namelen = sizeof (from); rcvmhpim.msg_iov = rcviovpim; rcvmhpim.msg_iovlen = 1; + rcvcmsglen = CMSG_SPACE(sizeof(struct in6_pktinfo)); + if (rcvcmsgbufpim == NULL && + (rcvcmsgbufpim = malloc(rcvcmsglen)) == NULL) + log(LOG_ERR, 0, "malloc failed"); rcvmhpim.msg_control = (caddr_t ) rcvcmsgbufpim; - rcvmhpim.msg_controllen = sizeof (rcvcmsgbufpim); - + rcvmhpim.msg_controllen = rcvcmsglen; sndmhpim.msg_namelen=sizeof(struct sockaddr_in6); sndmhpim.msg_iov=sndiovpim; sndmhpim.msg_iovlen=1; - sndmhpim.msg_control=(caddr_t)sndcmsgbufpim; - sndmhpim.msg_controllen=sizeof(sndcmsgbufpim); + sndcmsglen = CMSG_SPACE(sizeof(struct in6_pktinfo)); + if (sndcmsgbufpim == NULL && + (sndcmsgbufpim = malloc(sndcmsglen)) == NULL) + log(LOG_ERR, 0, "malloc failed"); + sndmhpim.msg_control = (caddr_t)sndcmsgbufpim; + sndmhpim.msg_controllen = sndcmsglen; cmsgp=(struct cmsghdr *)sndcmsgbufpim; - cmsgp->cmsg_len=CMSG_SPACE(sizeof(struct in6_pktinfo)); - cmsgp->cmsg_level=IPPROTO_IPV6; - cmsgp->cmsg_type=IPV6_PKTINFO; + cmsgp->cmsg_len = CMSG_LEN(sizeof(struct in6_pktinfo)); + cmsgp->cmsg_level = IPPROTO_IPV6; + cmsgp->cmsg_type = IPV6_PKTINFO; if ( register_input_handler(pim6_socket, pim6_read) <0) log(LOG_ERR,0,"Registering pim6 socket"); @@ -405,8 +415,8 @@ send_pim6(char *buf, struct sockaddr_in6 *src, } else { - sndmhpim.msg_control=(caddr_t)sndcmsgbufpim; - sndmhpim.msg_controllen=sizeof(sndcmsgbufpim); + sndmhpim.msg_control = (caddr_t)sndcmsgbufpim; + sndmhpim.msg_controllen = sndcmsglen; sndpktinfo->ipi6_ifindex=src->sin6_scope_id; memcpy(&sndpktinfo->ipi6_addr, &src->sin6_addr, sizeof(sndpktinfo->ipi6_addr));