diff -r 1d4c667fae7d -r 379bb2693dce sys/nfsclient/bootp_subr.c --- a/sys/nfsclient/bootp_subr.c Thu Mar 11 22:12:09 2010 -0500 +++ b/sys/nfsclient/bootp_subr.c Thu Mar 11 23:25:20 2010 -0500 @@ -570,6 +570,7 @@ bootpc_call(struct bootpc_globalcontext *gctx, struct thread *td) { struct socket *so; + struct sockaddr *fromsa; struct sockaddr_in *sin, dst; struct uio auio; struct sockopt sopt; @@ -586,6 +587,8 @@ CURVNET_SET(TD_TO_VNET(td)); + fromsa = NULL; + /* * Create socket and set its recieve timeout. */ @@ -801,8 +804,17 @@ auio.uio_resid = sizeof(gctx->reply); auio.uio_td = td; + /* + * Free fromsa possibly left behind by the + * previous iteration. + */ + if (fromsa != NULL) + { + free(fromsa, M_SONAME); + fromsa = NULL; + } rcvflg = 0; - error = soreceive(so, NULL, &auio, + error = soreceive(so, &fromsa, &auio, NULL, NULL, &rcvflg); gctx->secs = time_second - gctx->starttime; for (ifctx = gctx->interfaces; @@ -873,7 +885,7 @@ " on %s from ", s, ifctx->ireq.ifr_name); - print_in_addr(gctx->reply.siaddr); + print_sin_addr((struct sockaddr_in *)fromsa); if (gctx->reply.giaddr.s_addr != htonl(INADDR_ANY)) { printf(" via "); @@ -960,6 +972,8 @@ gotreply: out: + if (fromsa != NULL) + free(fromsa, M_SONAME); soclose(so); out0: CURVNET_RESTORE();