Browse Source

Plan 9 from Bell Labs 2007-07-11

David du Colombier 17 years ago
parent
commit
f556e0dbad

+ 3 - 3
dist/replica/_plan9.db

@@ -12822,13 +12822,13 @@ sys/src/cmd/ndb/convDNS2M.c - 664 sys sys 1182554015 7035
 sys/src/cmd/ndb/convM2DNS.c - 664 sys sys 1183866367 11830
 sys/src/cmd/ndb/cs.c - 664 sys sys 1182275681 33213
 sys/src/cmd/ndb/csquery.c - 664 sys sys 1174626119 1073
-sys/src/cmd/ndb/dblookup.c - 664 sys sys 1183406703 22445
+sys/src/cmd/ndb/dblookup.c - 664 sys sys 1184108014 22529
 sys/src/cmd/ndb/dn.c - 664 sys sys 1184026098 35996
 sys/src/cmd/ndb/dnarea.c - 664 sys sys 1175664421 2519
 sys/src/cmd/ndb/dnnotify.c - 664 sys sys 1183866408 3217
-sys/src/cmd/ndb/dnresolve.c - 664 sys sys 1184026119 34245
+sys/src/cmd/ndb/dnresolve.c - 664 sys sys 1184108033 34482
 sys/src/cmd/ndb/dns.c - 664 sys sys 1183750507 16257
-sys/src/cmd/ndb/dns.h - 664 sys sys 1183789361 11634
+sys/src/cmd/ndb/dns.h - 664 sys sys 1184107975 11658
 sys/src/cmd/ndb/dnsdebug.c - 664 sys sys 1183184428 8754
 sys/src/cmd/ndb/dnserver.c - 664 sys sys 1183447961 4402
 sys/src/cmd/ndb/dnsquery.c - 664 sys sys 1174626126 2435

+ 3 - 3
dist/replica/plan9.db

@@ -12822,13 +12822,13 @@ sys/src/cmd/ndb/convDNS2M.c - 664 sys sys 1182554015 7035
 sys/src/cmd/ndb/convM2DNS.c - 664 sys sys 1183866367 11830
 sys/src/cmd/ndb/cs.c - 664 sys sys 1182275681 33213
 sys/src/cmd/ndb/csquery.c - 664 sys sys 1174626119 1073
-sys/src/cmd/ndb/dblookup.c - 664 sys sys 1183406703 22445
+sys/src/cmd/ndb/dblookup.c - 664 sys sys 1184108014 22529
 sys/src/cmd/ndb/dn.c - 664 sys sys 1184026098 35996
 sys/src/cmd/ndb/dnarea.c - 664 sys sys 1175664421 2519
 sys/src/cmd/ndb/dnnotify.c - 664 sys sys 1183866408 3217
-sys/src/cmd/ndb/dnresolve.c - 664 sys sys 1184026119 34245
+sys/src/cmd/ndb/dnresolve.c - 664 sys sys 1184108033 34482
 sys/src/cmd/ndb/dns.c - 664 sys sys 1183750507 16257
-sys/src/cmd/ndb/dns.h - 664 sys sys 1183789361 11634
+sys/src/cmd/ndb/dns.h - 664 sys sys 1184107975 11658
 sys/src/cmd/ndb/dnsdebug.c - 664 sys sys 1183184428 8754
 sys/src/cmd/ndb/dnserver.c - 664 sys sys 1183447961 4402
 sys/src/cmd/ndb/dnsquery.c - 664 sys sys 1174626126 2435

+ 3 - 0
dist/replica/plan9.log

@@ -49481,3 +49481,6 @@
 1183867204 2 c sys/src/cmd/ndb/dnresolve.c - 664 sys sys 1183866553 34076
 1184027406 0 c sys/src/cmd/ndb/dn.c - 664 sys sys 1184026098 35996
 1184027406 1 c sys/src/cmd/ndb/dnresolve.c - 664 sys sys 1184026119 34245
+1184108403 0 c sys/src/cmd/ndb/dblookup.c - 664 sys sys 1184108014 22529
+1184108403 1 c sys/src/cmd/ndb/dnresolve.c - 664 sys sys 1184108033 34482
+1184108403 2 c sys/src/cmd/ndb/dns.h - 664 sys sys 1184107975 11658

+ 5 - 1
sys/src/cmd/ndb/dblookup.c

@@ -803,7 +803,7 @@ baddelegation(RR *rp, RR *nsrp, uchar *addr)
 	return 0;
 }
 
-static int
+int
 myaddr(char *addr)
 {
 	char *name, *line, *sp;
@@ -846,20 +846,24 @@ addlocaldnsserver(DN *dp, int class, char *ipaddr, int i)
 	DN *nsdp;
 	RR *rp;
 	char buf[32];
+	static QLock locdnslck;
 
 	/* reject our own ip addresses so we don't query ourselves via udp */
 	if (myaddr(ipaddr))
 		return;
 
+	qlock(&locdnslck);
 	for (n = 0; n < i && n < nelem(locdns) && locdns[n]; n++)
 		if (strcmp(locdns[n], ipaddr) == 0) {
 			dnslog("rejecting duplicate local dns server ip %s",
 				ipaddr);
+			qunlock(&locdnslck);
 			return;
 		}
 	if (n < nelem(locdns))
 		if (locdns[n] == nil || ++n < nelem(locdns))
 			locdns[n] = strdup(ipaddr); /* remember first few local ns */
+	qunlock(&locdnslck);
 
 	/* ns record for name server, make up an impossible name */
 	rp = rralloc(Tns);

+ 21 - 8
sys/src/cmd/ndb/dnresolve.c

@@ -882,8 +882,17 @@ mydnsquery(Query *qp, int medium, uchar *udppkt, int len)
 	NetConnInfo *nci;
 
 	queryck(qp);
+	domain = smprint("%I", udppkt);
+	if (myaddr(domain)) {
+		dnslog("mydnsquery: trying to send to myself (%s); bzzzt",
+			domain);
+		free(domain);
+		return rv;
+	}
+
 	switch (medium) {
 	case Udp:
+		free(domain);
 		nfd = dup(qp->udpfd, -1);
 		if (nfd < 0) {
 			warning("mydnsquery: qp->udpfd %d: %r", qp->udpfd);
@@ -907,7 +916,6 @@ mydnsquery(Query *qp, int medium, uchar *udppkt, int len)
 		break;
 	case Tcp:
 		/* send via TCP & keep fd around for reply */
-		domain = smprint("%I", udppkt);
 		alarm(10*1000);
 		qp->tcpfd = rv = dial(netmkaddr(domain, "tcp", "dns"), nil,
 			conndir, &qp->tcpctlfd);
@@ -1093,6 +1101,9 @@ procansw(Query *qp, DNSmsg *mp, uchar *srcip, int depth, Dest *p)
 	soarr = rrremtype(&mp->ns, Tsoa);
 
 	/* incorporate answers */
+	unique(mp->an);
+	unique(mp->ns);
+	unique(mp->ar);
 	if(mp->an)
 		rrattach(mp->an, (mp->flags & Fauth) != 0);
 	if(mp->ar)
@@ -1435,6 +1446,7 @@ netquery(Query *qp, int depth)
 	int lock, rv, triedin, inname, lcktype;
 	char buf[32];
 	RR *rp;
+	DN *dp;
 
 	if(depth > 12)			/* in a recursive loop? */
 		return 0;
@@ -1451,8 +1463,9 @@ netquery(Query *qp, int depth)
 	 * just lock at top-level invocation.
 	 */
 	lock = depth <= 1 && qp->req->isslave != 0;
+	dp = qp->dp;		/* ensure that it doesn't change underfoot */
 	if(lock) {
-		procsetname("query lock wait: %s %s from %s", qp->dp->name,
+		procsetname("query lock wait: %s %s from %s", dp->name,
 			rrname(qp->type, buf, sizeof buf), qp->req->from);
 		/*
 		 * don't make concurrent queries for this name.
@@ -1462,10 +1475,10 @@ netquery(Query *qp, int depth)
 		 * causing us to query other nameservers.
 		 */
 		lcktype = qtype2lck(qp->type);
-		qlock(&qp->dp->querylck[lcktype]);
+		qlock(&dp->querylck[lcktype]);
 	} else
 		lcktype = 0;
-	procsetname("netquery: %s", qp->dp->name);
+	procsetname("netquery: %s", dp->name);
 
 	/* prepare server RR's for incremental lookup */
 	for(rp = qp->nsrp; rp; rp = rp->next)
@@ -1480,7 +1493,7 @@ netquery(Query *qp, int depth)
 	 * for inside addresses and /net.alt for outside addresses,
 	 * thus bypassing other inside nameservers.
 	 */
-	inname = insideaddr(qp->dp->name);
+	inname = insideaddr(dp->name);
 	if (!cfg.straddle || inname) {
 		rv = udpquery(qp, mntpt, depth, Hurry, (cfg.inside? Inns: Outns));
 		triedin = 1;
@@ -1494,7 +1507,7 @@ netquery(Query *qp, int depth)
 		if (triedin)
 			dnslog(
 	   "[%d] netquery: internal nameservers failed for %s; trying external",
-				getpid(), qp->dp->name);
+				getpid(), dp->name);
 
 		/* prepare server RR's for incremental lookup */
 		for(rp = qp->nsrp; rp; rp = rp->next)
@@ -1503,10 +1516,10 @@ netquery(Query *qp, int depth)
 		rv = udpquery(qp, "/net.alt", depth, Patient, Outns);
 	}
 //	if (rv == 0)		/* could ask /net.alt/dns directly */
-//		askoutdns(qp->dp, qp->type);
+//		askoutdns(dp, qp->type);
 
 	if(lock)
-		qunlock(&qp->dp->querylck[lcktype]);
+		qunlock(&dp->querylck[lcktype]);
 	return rv;
 }
 

+ 1 - 0
sys/src/cmd/ndb/dns.h

@@ -492,6 +492,7 @@ RR*	dnsservers(int);
 RR*	domainlist(int);
 int	insideaddr(char *dom);
 int	insidens(uchar *ip);
+int	myaddr(char *addr);
 int	opendatabase(void);
 uchar*	outsidens(int);