*** ns_resp.c	1996/09/22 00:13:10	8.33
--- ns_resp.c	1996/09/22 07:08:47
***************
*** 113,117 ****
  			outofDataAFinal[] =	"out of data after final pass",
  			badNameFound[] =	"found an invalid domain name",
! 			wrongQuestion[] =	"answer to wrong question";
  
  struct db_list {
--- 113,118 ----
  			outofDataAFinal[] =	"out of data after final pass",
  			badNameFound[] =	"found an invalid domain name",
! 			wrongQuestion[] =	"answer to wrong question",
! 			danglingCname[] =	"dangling CNAME pointer";
  
  struct db_list {
***************
*** 234,238 ****
  	int restart;	/* flag for processing cname response */
  	int validanswer;
! 	int cname;
  	int count, founddata, foundname;
  	int buflen;
--- 235,239 ----
  	int restart;	/* flag for processing cname response */
  	int validanswer;
! 	int cname, lastwascname;
  	int count, founddata, foundname;
  	int buflen;
***************
*** 748,751 ****
--- 749,753 ----
  	nscount = 0;
  	cname = 0;
+ 	lastwascname = 0;
  	strcpy(aname, qname);
  
***************
*** 787,792 ****
  				strcpy(aname, (char *)dp->d_data);
  				cname = 1;
! 			} else
  				validanswer = 1;
  
  			dp->d_cred = (hp->aa && !strcasecmp(name, qname))
--- 789,797 ----
  				strcpy(aname, (char *)dp->d_data);
  				cname = 1;
! 				lastwascname = 1;
! 			} else {
  				validanswer = 1;
+ 				lastwascname = 0;
+ 			}
  
  			dp->d_cred = (hp->aa && !strcasecmp(name, qname))
***************
*** 795,803 ****
  		} else {
  			/* After answer section. */
  			if (i < ancount + aucount && type == T_NS) {
  				/* Authority section. */
! 				if ((!samedomain(name, qp->q_domain))
! 				    || (cname &&
! 					!samedomain(aname, qp->q_domain))
  				    ) {
  					syslog(LOG_DEBUG,
--- 800,812 ----
  		} else {
  			/* After answer section. */
+ 			if (lastwascname) {
+ 				syslog(LOG_DEBUG, "dangling cname (%s)",
+ 				       aname);
+ 				break;
+ 			}
  			if (i < ancount + aucount && type == T_NS) {
  				/* Authority section. */
! 				if (!samedomain(aname, name) ||
! 				    (!cname && !samedomain(name, qp->q_domain))
  				    ) {
  					syslog(LOG_DEBUG,
***************
*** 820,823 ****
--- 829,837 ----
  				free(flushset[i].fs_name);
  		free((char*)flushset);
+ 	}
+ 	if (lastwascname) {
+ 		syslog(LOG_DEBUG, "dangling cname (%s)", aname);
+ 		formerrmsg = danglingCname;
+ 		goto formerr;
  	}
  

