rem: if (size<0) goto error;
add: if (size<0) { LOG(L_ERR, "ERROR: get_record: size<0\n"); goto error; }
context: struct rdata* get_record(char* name, int type){	int size;	int qno, answers_no;	int r;	int ans_len;	static union dns_query buff;	unsigned char* p;	unsigned char* t;	unsigned char* end;	static unsigned char answer[ANS_SIZE];	unsigned short rtype, class, rdlength;	unsigned int ttl;	struct rdata* head;	struct rdata** crt;	struct rdata* rd;	struct srv_rdata* srv_rd;	struct srv_rdata* crt_srv;				head=rd=0;	crt=&head;	size=res_search(name, C_IN, type, buff.buff, sizeof(buff));	if (size<0) goto error;	else if (size > sizeof(buff)) size=sizeof(buff);		p=buff.buff+DNS_HDR_SIZE;	end=buff.buff+size;	if (p>end) goto error_boundary;	qno=ntohs((unsigned short)buff.hdr.qdcount);	for (r=0; r<qno; r++){		/* skip the name of the question */		if ((p=dns_skipname(p, end))==0) goto error;		p+=2+2; /* skip QCODE & QCLASS */	#if 0		for (;(p<end && (*p)); p++);		p+=1+2+2; /* skip the ending  '\0, QCODE and QCLASS */	#endif		if (p>end) goto error;	};	answers_no=ntohs((unsigned short)buff.hdr.ancount);	ans_len=ANS_SIZE;	t=answer;	for (r=0; (r<answers_no) && (p<end); r++){		/*  ignore it the default domain name */		if ((p=dns_skipname(p, end))==0) goto error;		/*		skip=dn_expand(buff.buff, end, p, t, ans_len);		p+=skip;		*/		/* check if enough space is left fot type, class, ttl & size */		if ((p+2+2+4+2)>end) goto error_boundary;		/* get type */		memcpy((void*) &rtype, (void*)p, 2);		rtype=ntohs(rtype);		p+=2;		/* get  class */		memcpy((void*) &class, (void*)p, 2);		class=ntohs(class);		p+=2;		/* get ttl*/		memcpy((void*) &ttl, (void*)p, 4);		ttl=ntohl(ttl);		p+=4;		/* get size */		memcpy((void*)&rdlength, (void*)p, 2);		rdlength=ntohs(rdlength);		p+=2;		/* check for type */		if (rtype!=type){			LOG(L_WARN, "WARNING: get_record: wrong type in answer\n");			p+=rdlength;			continue;		}		/* expand the "type" record  (rdata)*/		/* print it */		/*		printf("\ntype=%d class= %d, ttl= %d, rdlength= %d\n",				rtype, class, ttl, rdlength);		for (i=0;i<rdlength;i++){			printf("%x ", *(p+i));		}		printf("\n");		*/		rd=(struct rdata*) local_malloc(sizeof(struct rdata));		if (rd==0){			LOG(L_ERR, "ERROR: get_record: out of memory\n");			goto error;		}		rd->type=rtype;		rd->class=class;		rd->ttl=ttl;		switch(type){			case T_SRV:				srv_rd= dns_srv_parser(buff.buff, end, p);				rd->rdata=(void*)srv_rd;				if (srv_rd==0) goto error_parse;								/* insert sorted into the list				 * crt reused */				for (crt=&head; *crt; crt= &((*crt)->next)){					crt_srv=(struct srv_rdata*)(*crt)->rdata;					if ((srv_rd->priority <  crt_srv->priority) ||					   ( (srv_rd->priority == crt_srv->priority) && 							 (srv_rd->weight > crt_srv->weight) ) ){						/* insert here */						break;					}				}				/* insert here */				rd->next=*crt;				*crt=rd;								break;			case T_A:				rd->rdata=(void*) dns_a_parser(p,end);				if (rd->rdata==0) goto error_parse;				*crt=rd; /* crt points to the last "next" or the list head*/				crt=&(rd->next);				break;			case T_AAAA:				rd->rdata=(void*) dns_aaaa_parser(p,end);				if (rd->rdata==0) goto error_parse;				*crt=rd;				crt=&(rd->next);				break;			default:				LOG(L_ERR, "BUG: get_record: unknown type %d\n", type);				rd->rdata=0;				goto error;		}				p+=rdlength;			}	return head;error_boundary:		LOG(L_ERR, "ERROR: get_record: end of query buff reached\n");		return 0;error_parse:		LOG(L_ERR, "ERROR: get_record: rdata parse error \n");		if (rd) local_free(rd); /* rd->rdata=0 & rd is not linked yet into								   the list */error:		LOG(L_ERR, "ERROR: get_record \n");		if (head) free_rdata_list(head);	return 0;}