diff options
Diffstat (limited to 'lib/misc.c')
| -rw-r--r-- | lib/misc.c | 27 | 
1 files changed, 10 insertions, 17 deletions
@@ -524,7 +524,7 @@ struct ns_srv_reply **srv_lookup( char *service, char *protocol, char *domain )  	const unsigned char *buf;  	ns_msg nsh;  	ns_rr rr; -	int i, n, len, size; +	int n, len, size;  	g_snprintf( name, sizeof( name ), "_%s._%s.%s", service, protocol, domain ); @@ -537,27 +537,20 @@ struct ns_srv_reply **srv_lookup( char *service, char *protocol, char *domain )  	n = 0;  	while( ns_parserr( &nsh, ns_s_an, n, &rr ) == 0 )  	{ -		size = ns_rr_rdlen( rr ); +		char name[NS_MAXDNAME]; + +		if( ns_rr_rdlen( rr ) < 7) +		    break; +  		buf = ns_rr_rdata( rr ); -		len = 0; -		for( i = 6; i < size && buf[i]; i += buf[i] + 1 ) -			len += buf[i] + 1; -		 -		if( i > size ) +		if( dn_expand(querybuf, querybuf + size, &buf[6], name, NS_MAXDNAME) == -1 )  			break; + +		len = strlen(name) + 1;  		reply = g_malloc( sizeof( struct ns_srv_reply ) + len ); -		memcpy( reply->name, buf + 7, len ); -		 -		for( i = buf[6]; i < len && buf[7+i]; i += buf[7+i] + 1 ) -			reply->name[i] = '.'; -		 -		if( i > len ) -		{ -			g_free( reply ); -			break; -		} +		memcpy( reply->name, name, len );  		reply->prio = ( buf[0] << 8 ) | buf[1];  		reply->weight = ( buf[2] << 8 ) | buf[3];  | 
