$OpenBSD: patch-tools_rd6_c,v 1.1 2013/09/26 21:52:36 bluhm Exp $
--- tools/rd6.c.orig	Thu Aug 22 11:49:10 2013
+++ tools/rd6.c	Sun Sep  8 21:37:46 2013
@@ -1036,8 +1036,6 @@ int main(int argc, char **argv){
 		exit(1);
 	}
 
-	srandom(time(NULL));
-
 	/*
 	  If the flood option ("-F") has been specified, but no prefix has been specified,
 	  select the random Source Addresses from the link-local unicast prefix (fe80::/64).
@@ -1062,8 +1060,7 @@ int main(int argc, char **argv){
 	}
 
 	if(!hsrcaddr_f && !learnrouter_f)	/* Source link-layer address is randomized by default */
-		for(i=0; i<6; i++)
-			hsrcaddr.a[i]= random();
+		arc4random_buf(&hsrcaddr, sizeof(struct ether_addr));
 
 	if(!hdstaddr_f && dstaddr_f){
 		if(ether_pton(ETHER_ALLNODES_LINK_ADDR, &hdstaddr, sizeof(hdstaddr)) == 0){
@@ -1208,19 +1205,19 @@ int main(int argc, char **argv){
 			tcpflags= tcpflags | TH_ACK;
 
 		if(!tcpack_f)
-			tcpack= random();
+			tcpack= arc4random();
 
 		if(!tcpseq_f)
-			tcpseq= random();
+			tcpseq= arc4random();
 
 		if(!tcpwin_f)
-			tcpwin= ((u_int16_t) random() + 1500) & (u_int16_t)0x7f00;
+			tcpwin= ((u_int16_t) arc4random() + 1500) & (u_int16_t)0x7f00;
 
 		if(!peerport_f)
-			peerport= random();
+			peerport= arc4random();
 
 		if(!redirport_f)
-			redirport= random();
+			redirport= arc4random();
 
 		if(!tcpurg_f)
 			tcpurg= 0;
@@ -1228,18 +1225,18 @@ int main(int argc, char **argv){
 
 	if(rhudp_f){
 		if(!peerport_f)
-			peerport= random();
+			peerport= arc4random();
 
 		if(!redirport_f)
-			redirport= random();
+			redirport= arc4random();
 	}
 
 	if(rhicmp6_f){
 		if(!icmp6id_f)
-			icmp6id= random();
+			icmp6id= arc4random();
 
 		if(!icmp6seq_f)
-			icmp6seq= random();
+			icmp6seq= arc4random();
 	}
 
 	if(verbose_f){
@@ -1601,7 +1598,7 @@ void send_packet(const u_char *pktdata, struct pcap_pk
 				ipv6->ip6_src.s6_addr16[i]= 0;
 
 			for(i=startrand; i<8; i++)
-				ipv6->ip6_src.s6_addr16[i]=random();
+				ipv6->ip6_src.s6_addr16[i]=arc4random();
 
 			if(srcpreflen%16){
 				mask=0xffff;
@@ -1617,8 +1614,7 @@ void send_packet(const u_char *pktdata, struct pcap_pk
 				ipv6->ip6_src.s6_addr16[i]= ipv6->ip6_src.s6_addr16[i] | srcaddr.s6_addr16[i];
 
 			if(!hsrcaddr_f){
-				for(i=0; i<6; i++)
-					ethernet->src.a[i]= random();
+				arc4random_buf(&ethernet->src, sizeof(struct ether_addr));
 			}
 	    
 			if(tllaopt_f && !tllaopta_f){
@@ -1640,7 +1636,7 @@ void send_packet(const u_char *pktdata, struct pcap_pk
 					rd->nd_rd_dst.s6_addr16[i]= 0;
 
 				for(i=startrand; i<8; i++)
-					rd->nd_rd_dst.s6_addr16[i]=random();
+					rd->nd_rd_dst.s6_addr16[i]=arc4random();
 
 				if(redirpreflen%16){
 					mask=0xffff;
@@ -1673,7 +1669,7 @@ void send_packet(const u_char *pktdata, struct pcap_pk
 						rd->nd_rd_target.s6_addr16[i]= 0;
 
 					for(i=startrand; i<8; i++)
-						rd->nd_rd_target.s6_addr16[i]=random();
+						rd->nd_rd_target.s6_addr16[i]=arc4random();
 
 					if(targetpreflen%16){
 						mask=0xffff;
@@ -1818,7 +1814,7 @@ void send_packet(const u_char *pktdata, struct pcap_pk
 							rhtcp->th_urp= htons(tcpurg);
 							rhtcp->th_win= htons(tcpwin);
 							rhtcp->th_off= MIN_TCP_HLEN >> 2;
-							rhtcp->th_sum = random();
+							rhtcp->th_sum = arc4random();
 
 							if(rhbytes <= (MIN_IPV6_HLEN + MIN_TCP_HLEN)){
 								bcopy(rhbuff, ptr, rhbytes);
@@ -1828,12 +1824,9 @@ void send_packet(const u_char *pktdata, struct pcap_pk
 								bcopy(rhbuff, ptr, MIN_IPV6_HLEN+MIN_TCP_HLEN);
 								ptr += MIN_IPV6_HLEN+MIN_TCP_HLEN;
 								rhbytes -= MIN_IPV6_HLEN+MIN_TCP_HLEN;
-
-								while(rhbytes>=4){
-									*(u_int32_t *)ptr = random();
-									ptr += sizeof(u_int32_t);
-									rhbytes -= sizeof(u_int32_t);
-								}
+								arc4random_buf(ptr, rhbytes);
+								ptr += rhbytes;
+								rhbytes = 0;
 							}
 						}
 
@@ -1843,7 +1836,7 @@ void send_packet(const u_char *pktdata, struct pcap_pk
 							rhudp->uh_sport= htons(peerport);
 							rhudp->uh_dport= htons(redirport);
 							rhudp->uh_ulen= rhipv6->ip6_plen;
-							rhudp->uh_sum= random();
+							rhudp->uh_sum= arc4random();
 
 							if(rhbytes <= (MIN_IPV6_HLEN + MIN_UDP_HLEN)){
 								bcopy(rhbuff, ptr, rhbytes);
@@ -1853,11 +1846,9 @@ void send_packet(const u_char *pktdata, struct pcap_pk
 								bcopy(rhbuff, ptr, MIN_IPV6_HLEN+MIN_UDP_HLEN);
 								ptr += MIN_IPV6_HLEN+MIN_UDP_HLEN;
 								rhbytes -= MIN_IPV6_HLEN+MIN_UDP_HLEN;
-								while(rhbytes>=4){
-									*(u_int32_t *)ptr = random();
-									ptr += sizeof(u_int32_t);
-									rhbytes -= sizeof(u_int32_t);
-								}
+								arc4random_buf(ptr, rhbytes);
+								ptr += rhbytes;
+								rhbytes = 0;
 							}
 						}
 						else if(rhicmp6_f){
@@ -1865,9 +1856,9 @@ void send_packet(const u_char *pktdata, struct pcap_pk
 							rhicmp6 = (struct icmp6_hdr *) (rhbuff + sizeof(struct ip6_hdr));
 							rhicmp6->icmp6_type = ICMP6_ECHO_REQUEST;
 							rhicmp6->icmp6_code = 0;
-							rhicmp6->icmp6_cksum = random();
-							rhicmp6->icmp6_data16[0]= random(); /* Identifier */
-							rhicmp6->icmp6_data16[1]= random(); /* Sequence Number */
+							rhicmp6->icmp6_cksum = arc4random();
+							rhicmp6->icmp6_data16[0]= arc4random(); /* Identifier */
+							rhicmp6->icmp6_data16[1]= arc4random(); /* Sequence Number */
 
 							if(rhbytes <= (MIN_IPV6_HLEN + MIN_ICMP6_HLEN)){
 								bcopy(rhbuff, ptr, rhbytes);
@@ -1877,11 +1868,9 @@ void send_packet(const u_char *pktdata, struct pcap_pk
 								bcopy(rhbuff, ptr, MIN_IPV6_HLEN+MIN_ICMP6_HLEN);
 								ptr += MIN_IPV6_HLEN+MIN_ICMP6_HLEN;
 								rhbytes -= MIN_IPV6_HLEN+MIN_ICMP6_HLEN;
-								while(rhbytes>=4){
-									*(u_int32_t *)ptr = random();
-									ptr += sizeof(u_int32_t);
-									rhbytes -= sizeof(u_int32_t);
-								}
+								arc4random_buf(ptr, rhbytes);
+								ptr += rhbytes;
+								rhbytes = 0;
 							}
 						}
 					}
@@ -1920,7 +1909,7 @@ void send_packet(const u_char *pktdata, struct pcap_pk
 
 					memcpy(fptr, (char *) &fraghdr, FRAG_HDR_SIZE);
 					fh= (struct ip6_frag *) fptr;
-					fh->ip6f_ident=random();
+					fh->ip6f_ident=arc4random();
 					startoffragment = fptr + FRAG_HDR_SIZE;
 
 					/*
@@ -2568,7 +2557,7 @@ void randomize_ipv6_addr(struct in6_addr *ipv6addr, st
 		ipv6addr->s6_addr16[i]= 0;
 
 	for(i=startrand; i<8; i++)
-		ipv6addr->s6_addr16[i]=random();
+		ipv6addr->s6_addr16[i]=arc4random();
 
 	if(preflen%16){
 		mask=0xffff;
@@ -2593,8 +2582,7 @@ void randomize_ipv6_addr(struct in6_addr *ipv6addr, st
  */
 
 void randomize_ether_addr(struct ether_addr *ethaddr){
-	for(i=0; i<6; i++)
-		ethaddr->a[i]= random();
+	arc4random_buf(ethaddr, sizeof(struct ether_addr));
 
 	ethaddr->a[0]= (ethaddr->a[0] & 0xfc) | 0x02;
 }
