rem: DBG("DEBUG: via branch building finished\n");
context: char * build_req_buf_from_sip_req(	struct sip_msg* msg,									unsigned int *returned_len){	unsigned int len, new_len, via_len, received_len, uri_len, branch_len;	char* line_buf;	char* received_buf;	char* tmp;	int tmp_len;	char* new_buf;	char* orig;	char* buf;	unsigned int offset, s_offset, size;	unsigned long source_ip;	struct lump *t,*r;	struct lump* anchor;	orig=msg->orig;	buf=msg->buf;	len=msg->len;	source_ip=msg->src_ip;	received_len=0;	new_buf=0;	line_buf=0;	received_buf=0;	line_buf=pkg_malloc(sizeof(char)*MAX_VIA_LINE_SIZE);	if (line_buf==0){		LOG(L_ERR, "ERROR: build_req_buf_from_sip_req: out of memory\n");		goto error1;	}/*	via_len=snprintf(line_buf, MAX_VIA_LINE_SIZE, "Via: SIP/2.0/UDP %s:%d\r\n",						names[0], port_no);*/	via_len=MY_VIA_LEN+names_len[0]; /* space included in MY_VIA*/	/* jku: if we compute branches using MD5 it will take 32 bytes */	branch_len= (loop_checks ? MY_BRANCH_LEN : MY_BRANCH_LEN -1 + MD5_LEN)+					msg->add_to_branch_len;	if ((via_len+port_no_str_len+branch_len+CRLF_LEN)<MAX_VIA_LINE_SIZE){		memcpy(line_buf, MY_VIA, MY_VIA_LEN);		memcpy(line_buf+MY_VIA_LEN, names[0], names_len[0]);		if (port_no!=SIP_PORT){			memcpy(line_buf+via_len, port_no_str, port_no_str_len);			via_len+=port_no_str_len;		}		/* jku: branch parameter */		memcpy(line_buf+via_len, MY_BRANCH, MY_BRANCH_LEN );		via_len+=MY_BRANCH_LEN;		/* loop checks ? */		if (loop_checks) {			if (check_transaction_quadruple( msg )) {				str src[5];				int r;							src[0]= msg->from->body;				src[1]= msg->to->body; 				src[2]= msg->callid->body; 				src[3]= msg->first_line.u.request.uri; 				src[4]= get_cseq( msg )->number;				MDStringArray ( line_buf+via_len-1, src, 5 );				DBG("DEBUG: build_req_buf_from_sip_req: branch loop "						"detection: %s, %s, %s, %s, %s -> %s32\n",					msg->from->body.s, msg->to->body.s, msg->callid->body.s, 					msg->first_line.u.request.uri.s,					((struct cseq_body *)(msg->cseq->parsed))->number.s,					line_buf+via_len-1 );				DBG("WARNING: build_req_buf_from_sip_req: branch computation "						"NOT over canonical values\n");				via_len+=MD5_LEN - 1;							} else DBG("DEBUG: build_req_buf_from_sip_req: required HFs for "					"loop checking missing\n");		}		DBG("DEBUG: will add branch now: %s (%d)\n", msg->add_to_branch_s, msg->add_to_branch_len );		/* someone wants me to add something to branch here ? */		memcpy(line_buf+via_len, msg->add_to_branch_s,				msg->add_to_branch_len );		via_len+=msg->add_to_branch_len;		memcpy(line_buf+via_len, CRLF, CRLF_LEN);		via_len+=CRLF_LEN;		line_buf[via_len]=0; /* null terminate the string*/		DBG("DEBUG: via branch building finished\n");	}else{		LOG(L_ERR, "build_req_buf_from_sip_req: ERROR: via too long (%d)\n",				via_len);		goto error1;	}	/* check if received needs to be added */	if (check_address(source_ip, msg->via1->host.s, received_dns)!=0){		received_buf=pkg_malloc(sizeof(char)*MAX_RECEIVED_SIZE);		if (received_buf==0){			LOG(L_ERR, "ERROR: build_req_buf_from_sip_req: out of memory\n");			goto error1;		}		/*		received_len=snprintf(received_buf, MAX_RECEIVED_SIZE,								";received=%s",								inet_ntoa(*(struct in_addr *)&source_ip));		*/		memcpy(received_buf, RECEIVED, RECEIVED_LEN);		tmp=q_inet_itoa( /* *(struct in_addr *)& */source_ip);		tmp_len=strlen(tmp);		received_len=RECEIVED_LEN+tmp_len;		memcpy(received_buf+RECEIVED_LEN, tmp, tmp_len);		received_buf[received_len]=0; /*null terminate it */	}	/* add via header to the list */	/* try to add it before msg. 1st via */	/*add first via, as an anchor for second via*/	anchor=anchor_lump(&(msg->add_rm), msg->via1->hdr.s-buf, 0, HDR_VIA);	if (anchor==0) goto error;	if (insert_new_lump_before(anchor, line_buf, via_len, HDR_VIA)==0)		goto error;	/* if received needs to be added, add anchor after host and add it */	if (received_len){		if (msg->via1->params.s){				size= msg->via1->params.s-msg->via1->hdr.s-1; /*compensate															  for ';' */		}else{				size= msg->via1->host.s-msg->via1->hdr.s+msg->via1->host.len;				if (msg->via1->port!=0){					size+=strlen(msg->via1->hdr.s+size+1)+1; /* +1 for ':'*/				}		}		anchor=anchor_lump(&(msg->add_rm),msg->via1->hdr.s-buf+size,0,				HDR_VIA);		if (anchor==0) goto error;		if (insert_new_lump_after(anchor, received_buf, received_len, HDR_VIA)				==0 ) goto error;	}	/* compute new msg len and fix overlapping zones*/	new_len=len;	s_offset=0;	for(t=msg->add_rm;t;t=t->next){		for(r=t->before;r;r=r->before){			switch(r->op){				case LUMP_ADD:					new_len+=r->len;					break;				default:					/* only ADD allowed for before/after */					LOG(L_CRIT, "BUG:build_req_buf_from_sip_req: invalid op "							"for data lump (%x)\n", r->op);			}		}		switch(t->op){			case LUMP_ADD:				new_len+=t->len;				break;			case LUMP_DEL:				/* fix overlapping deleted zones */				if (t->u.offset < s_offset){					/* change len */					if (t->len>s_offset-t->u.offset)							t->len-=s_offset-t->u.offset;					else t->len=0;					t->u.offset=s_offset;				}				s_offset=t->u.offset+t->len;				new_len-=t->len;				break;			case LUMP_NOP:				/* fix offset if overlapping on a deleted zone */				if (t->u.offset < s_offset){					t->u.offset=s_offset;				}else					s_offset=t->u.offset;				/* do nothing */				break;			debug:				LOG(L_CRIT,"BUG:build_req_buf_from_sip_req: invalid"							" op for data lump (%x)\n", r->op);		}		for (r=t->after;r;r=r->after){			switch(r->op){				case LUMP_ADD:					new_len+=r->len;					break;				default:					/* only ADD allowed for before/after */					LOG(L_CRIT, "BUG:build_req_buf_from_sip_req: invalid"								" op for data lump (%x)\n", r->op);			}		}	}	if (msg->new_uri.s){		uri_len=msg->new_uri.len;		new_len=new_len-msg->first_line.u.request.uri.len+uri_len;	}	new_buf=(char*)malloc(new_len+1);	if (new_buf==0){		LOG(L_ERR, "ERROR: build_req_buf_from_sip_req: out of memory\n");		goto error;	}	offset=s_offset=0;	if (msg->new_uri.s){		/* copy message up to uri */		size=msg->first_line.u.request.uri.s-buf;		memcpy(new_buf, orig, size);		offset+=size;		s_offset+=size;		/* add our uri */		memcpy(new_buf+offset, msg->new_uri.s, uri_len);		offset+=uri_len;		s_offset+=msg->first_line.u.request.uri.len; /* skip original uri */	}/* copy msg adding/removing lumps */	for (t=msg->add_rm;t;t=t->next){		switch(t->op){			case LUMP_ADD:				/* just add it here! */				/* process before  */				for(r=t->before;r;r=r->before){					switch (r->op){						case LUMP_ADD:							/*just add it here*/							memcpy(new_buf+offset, r->u.value, r->len);							offset+=r->len;							break;						default:							/* only ADD allowed for before/after */							LOG(L_CRIT, "BUG:build_req_buf_from_sip_req: "									"invalid op for data lump (%x)\n", r->op);					}				}				/* copy "main" part */				memcpy(new_buf+offset, t->u.value, t->len);				offset+=t->len;				/* process after */				for(r=t->after;r;r=r->after){					switch (r->op){						case LUMP_ADD:							/*just add it here*/							memcpy(new_buf+offset, r->u.value, r->len);							offset+=r->len;							break;						default:							/* only ADD allowed for before/after */							LOG(L_CRIT, "BUG:build_req_buf_from_sip_req: "									"invalid op for data lump (%x)\n", r->op);					}				}				break;			case LUMP_NOP:			case LUMP_DEL:				/* copy till offset */				if (s_offset>t->u.offset){					DBG("Warning: (%d) overlapped lumps offsets,"						" ignoring(%x, %x)\n", t->op, s_offset,t->u.offset);					/* this should've been fixed above (when computing len) */					/* just ignore it*/					break;				}				size=t->u.offset-s_offset;				if (size){					memcpy(new_buf+offset, orig+s_offset,size);					offset+=size;					s_offset+=size;				}				/* process before  */				for(r=t->before;r;r=r->before){					switch (r->op){						case LUMP_ADD:							/*just add it here*/							memcpy(new_buf+offset, r->u.value, r->len);							offset+=r->len;							break;						default:							/* only ADD allowed for before/after */							LOG(L_CRIT, "BUG:build_req_buf_from_sip_req: "									"invalid op for data lump (%x)\n", r->op);					}				}				/* process main (del only) */				if (t->op==LUMP_DEL){					/* skip len bytes from orig msg */					s_offset+=t->len;				}				/* process after */				for(r=t->after;r;r=r->after){					switch (r->op){						case LUMP_ADD:							/*just add it here*/							memcpy(new_buf+offset, r->u.value, r->len);							offset+=r->len;							break;						default:							/* only ADD allowed for before/after */							LOG(L_CRIT, "BUG:build_req_buf_from_sip_req: "									"invalid op for data lump (%x)\n", r->op);					}				}				break;			default:					LOG(L_CRIT, "BUG: build_req_buf_from_sip_req: "							"unknown op (%x)\n", t->op);		}	}	/* copy the rest of the message */	memcpy(new_buf+offset, orig+s_offset, len-s_offset);	new_buf[new_len]=0;	*returned_len=new_len;	return new_buf;error1:	if (line_buf) pkg_free(line_buf);	if (received_buf) pkg_free(received_buf);error:	if (new_buf) free(new_buf);	*returned_len=0;	return 0;}