rem: LOG(L_INFO, "ERROR: parse_first_line: message too short\n");
add: LOG(L_INFO, "ERROR: parse_first_line: message too short: %d\n", len);
context: char* parse_first_line(char* buffer, unsigned int len, struct msg_start * fl){		char *tmp;	char* second;	char* third;	char* nl;	int offset;	/* int l; */	char* end;	char s1,s2,s3;		/* grammar:		request  =  method SP uri SP version CRLF		response =  version SP status  SP reason  CRLF		(version = "SIP/2.0")	*/		end=buffer+len;	/* see if it's a reply (status) */	/* jku  -- parse well-known methods */	/* drop messages which are so short they are for sure useless;           utilize knowledge of minimum size in parsing the first	   token         */	if (len <=16 ) {		LOG(L_INFO, "ERROR: parse_first_line: message too short\n");		goto error1;	}	tmp=buffer;  	/* is it perhaps a reply, ie does it start with "SIP...." ? */	if ( 	(*tmp=='S' || *tmp=='s') && 		strncasecmp( tmp+1, SIP_VERSION+1, SIP_VERSION_LEN-1)==0 &&		(*(tmp+SIP_VERSION_LEN)==' ')) {			fl->type=SIP_REPLY;			fl->u.reply.version.len=SIP_VERSION_LEN;			tmp=buffer+SIP_VERSION_LEN;	} else IFISMETHOD( INVITE, 'I' )	else IFISMETHOD( CANCEL, 'C')	else IFISMETHOD( ACK, 'A' )	else IFISMETHOD( BYE, 'B' )	/* if you want to add another method XXX, include METHOD_XXX in           H-file (this is the value which you will take later in           processing and define XXX_LEN as length of method name;	   then just call IFISMETHOD( XXX, 'X' ) ... 'X' is the first	   latter; everything must be capitals	*/	else {		/* neither reply, nor any of known method requests, 		   let's believe it is an unknown method request        	*/		tmp=eat_token_end(buffer,buffer+len);		if ((tmp==buffer)||(tmp>=end)){			LOG(L_INFO, "ERROR:parse_first_line: empty  or bad first line\n");			goto error1;		}		if (*tmp!=' ') {			LOG(L_INFO, "ERROR:parse_first_line: method not followed by SP\n");			goto error1;		}		fl->type=SIP_REQUEST;		fl->u.request.method_value=METHOD_OTHER;		fl->u.request.method.len=tmp-buffer;	}	/* identifying type of message over now; 	   tmp points at space after; go ahead */	fl->u.request.method.s=buffer;  /* store ptr to first token */	(*tmp)=0;			/* mark the 1st token end */	second=tmp+1;			/* jump to second token */	offset=second-buffer;/* EoJku */		/* next element */	tmp=eat_token_end(second, second+len-offset);	if (tmp>=end){		goto error;	}	offset+=tmp-second;	third=eat_space_end(tmp, tmp+len-offset);	offset+=third-tmp;	if ((third==tmp)||(tmp>=end)){		goto error;	}	*tmp=0; /* mark the end of the token */	fl->u.request.uri.s=second;	fl->u.request.uri.len=tmp-second;	/* jku: parse status code */	if (fl->type==SIP_REPLY) {		if (fl->u.request.uri.len!=3) {			LOG(L_INFO, "ERROR:parse_first_line: len(status code)!=3: %s\n",				second );			goto error;		}		s1=*second; s2=*(second+1);s3=*(second+2);		if (s1>='0' && s1<='9' && 		    s2>='0' && s2<='9' &&		    s3>='0' && s3<='9' ) {			fl->u.reply.statusclass=s1-'0';			fl->u.reply.statuscode=fl->u.reply.statusclass*100+10*(s2-'0')+(s3-'0');		} else {			LOG(L_INFO, "ERROR:parse_first_line: status_code non-numerical: %s\n",				second );			goto error;		}	}	/* EoJku */	/*  last part: for a request it must be the version, for a reply	 *  it can contain almost anything, including spaces, so we don't care	 *  about it*/	if (fl->type==SIP_REQUEST){		tmp=eat_token_end(third,third+len-offset);		offset+=tmp-third;		if ((tmp==third)||(tmp>=end)){			goto error;		}		if (! is_empty_end(tmp, tmp+len-offset)){			goto error;		}	}else{		tmp=eat_token2_end(third,third+len-offset,'\r'); /* find end of line 												  ('\n' or '\r') */		if (tmp>=end){ /* no crlf in packet => invalid */			goto error;		}		offset+=tmp-third;	}	nl=eat_line(tmp,len-offset);	if (nl>=end){ /* no crlf in packet or only 1 line > invalid */		goto error;	}	*tmp=0;	fl->u.request.version.s=third;	fl->u.request.version.len=tmp-third;		return nl;error:	LOG(L_INFO, "ERROR:parse_first_line: bad %s first line\n", 		(fl->type==SIP_REPLY)?"reply(status)":"request");error1:	fl->type=SIP_INVALID;	LOG(L_INFO, "ERROR: at line 0 char %d\n", offset);	/* skip  line */	nl=eat_line(buffer,len);	return nl;}