*** ns_resp.c	1996/08/27 17:53:21	8.31
--- ns_resp.c	1996/08/28 08:06:26
***************
*** 113,138 ****
  			outofDataAFinal[] =	"out of data after final pass",
  			badNameFound[] =	"found an invalid domain name";
! #define FLUSHRRSET
! #ifdef FLUSHRRSET
  struct db_list {
  	struct db_list *db_next;
  	struct databuf *db_dp;
  };
  struct flush_set {
! 	char *fs_name;
! 	int fs_type;
! 	int fs_class;
! 	u_int fs_cred;
  	struct db_list *fs_list;
  };
  
  static void		rrsetadd __P((struct flush_set *, char *,
! 					struct databuf *)),
  			rrsetupdate __P((struct flush_set *, int flags)),
  			flushrrset __P((struct flush_set *));
! static int		rrsetcmp __P((char *, struct db_list *));
! #endif
! 
! static int		check_root __P((void)),
  			check_ns __P((void)),
  			rrextract __P((u_char *, int, u_char *,
--- 113,136 ----
  			outofDataAFinal[] =	"out of data after final pass",
  			badNameFound[] =	"found an invalid domain name";
! 
  struct db_list {
  	struct db_list *db_next;
  	struct databuf *db_dp;
  };
+ 
  struct flush_set {
! 	char *		fs_name;
! 	int		fs_type;
! 	int		fs_class;
! 	u_int		fs_cred;
  	struct db_list *fs_list;
  };
  
  static void		rrsetadd __P((struct flush_set *, char *,
! 				      struct databuf *)),
  			rrsetupdate __P((struct flush_set *, int flags)),
  			flushrrset __P((struct flush_set *));
! static int		rrsetcmp __P((char *, struct db_list *)),
! 			check_root __P((void)),
  			check_ns __P((void)),
  			rrextract __P((u_char *, int, u_char *,
***************
*** 228,234 ****
  	register u_char *cp;
  	u_char *eom = msg + msglen;
- #ifdef FLUSHRRSET
  	struct flush_set *flushset;
- #endif
  	struct sockaddr_in *nsa;
  	struct databuf *nsp[NSMAX];
--- 226,230 ----
***************
*** 241,245 ****
  	int buflen;
  	int newmsglen;
! 	char name[MAXDNAME], qname[MAXDNAME], msgbuf[MAXDNAME*2];
  	char *dname, tmpdomain[MAXDNAME*2];
  	const char *fname;
--- 237,242 ----
  	int buflen;
  	int newmsglen;
! 	char name[MAXDNAME*2], qname[MAXDNAME*2], aname[MAXDNAME*2];
! 	char msgbuf[MAXDNAME*2];
  	char *dname, tmpdomain[MAXDNAME*2];
  	const char *fname;
***************
*** 538,545 ****
  #ifdef LAME_DELEGATION
  	/*
! 	 *  Non-authoritative, no answer, no error, with referral
  	 */
! 	if (qdcount == 1 && hp->rcode == NOERROR && !hp->aa && ancount == 0
! 	    && aucount > 0
  #ifdef BIND_NOTIFY
  	    && hp->opcode != NS_NOTIFY_OP
--- 535,541 ----
  #ifdef LAME_DELEGATION
  	/*
! 	 *  Non-authoritative, no answer, no error, with referral.
  	 */
! 	if (hp->rcode == NOERROR && !hp->aa && ancount == 0 && aucount > 0
  #ifdef BIND_NOTIFY
  	    && hp->opcode != NS_NOTIFY_OP
***************
*** 747,752 ****
  	nscount = 0;
  	cname = 0;
  
- #ifdef FLUSHRRSET
  	if (count) {
  		/* allocate 1 extra record for end of set detection */
--- 743,748 ----
  	nscount = 0;
  	cname = 0;
+ 	strcpy(aname, qname);
  
  	if (count) {
  		/* allocate 1 extra record for end of set detection */
***************
*** 775,800 ****
  			continue;
  		type = dp->d_type;
! 		if (type == T_NS && i >= ancount && i < ancount + aucount) {
! 			if (qp->q_domain && !samedomain(name, qp->q_domain)) {
! 				syslog(LOG_DEBUG, "bad referral (%s !< %s)",
! 				       name, qp->q_domain);
  				continue;
  			}
! 			nscount++;
! 		}
! 		if (i < ancount)
  			dp->d_cred = (hp->aa && !strcasecmp(name, qname))
  				? DB_C_AUTH
  				: DB_C_ANSWER;
! 		else
  			dp->d_cred = (qp->q_flags & Q_PRIMING)
  				? DB_C_ANSWER
  				: DB_C_ADDITIONAL;
- 		if (i < ancount) {
- 			if (type != T_CNAME || qtype == T_CNAME ||
- 			    qtype == T_ANY)
- 				validanswer = 1;
- 			else
- 				cname = 1;
  		}
  		rrsetadd(flushset, name, dp);
--- 771,810 ----
  			continue;
  		type = dp->d_type;
! 		if (i < ancount) {
! 			/* Answer section. */
! 			if (strcasecmp(name, aname) != 0) {
! 				syslog(LOG_DEBUG, "wrong ans. name (%s != %s)",
! 				       name, aname);
  				continue;
  			}
! 			if (type == T_CNAME &&
! 			    qtype != T_CNAME && qtype != T_ANY) {
! 				strcpy(aname, (char *)dp->d_data);
! 				cname = 1;
! 			} else
! 				validanswer = 1;
! 
  			dp->d_cred = (hp->aa && !strcasecmp(name, qname))
  				? DB_C_AUTH
  				: DB_C_ANSWER;
! 		} else {
! 			/* After answer section. */
! 			if (i < ancount + aucount && type == T_NS) {
! 				/* Authority section. */
! 				if ((qp->q_domain &&
! 				     !samedomain(name, qp->q_domain))
! 				    || (cname &&
! 					!samedomain(aname, qp->q_domain))
! 				    ) {
! 					syslog(LOG_DEBUG,
! 					       "bad referral (%s !< %s)",
! 					       name, qp->q_domain);
! 					continue;
! 				}
! 				nscount++;
! 			}
  			dp->d_cred = (qp->q_flags & Q_PRIMING)
  				? DB_C_ANSWER
  				: DB_C_ADDITIONAL;
  		}
  		rrsetadd(flushset, name, dp);
***************
*** 807,811 ****
  		free((char*)flushset);
  	}
- #endif
  
  	if (cp > eom) {
--- 817,820 ----
***************
*** 2651,2658 ****
  }
  
- #ifdef FLUSHRRSET
  static void
  rrsetadd(flushset, name, dp)
! 	struct flush_set * flushset;
  	char *name;
  	struct databuf *dp;
--- 2660,2666 ----
  }
  
  static void
  rrsetadd(flushset, name, dp)
! 	struct flush_set *flushset;
  	char *name;
  	struct databuf *dp;
***************
*** 2807,2811 ****
  	db_free(dp);
  }
- #endif
  
  /*
--- 2815,2818 ----

