Line data Source code
1 : #include "fd_lookup.h" 2 : 3 : int 4 : fd_dns_parse( 5 : uchar const * r, 6 : int rlen, 7 : int (* callback)( 8 : void *, 9 : int, 10 : void const *, 11 : int, 12 : void const *, 13 : int 14 : ), 15 : void * ctx 16 0 : ) { 17 0 : int qdcount, ancount; 18 0 : int len; 19 : 20 0 : if( rlen<12 ) return -1; 21 0 : if( (r[3]&15) ) return 0; 22 0 : uchar const * p = r+12; 23 0 : qdcount = r[4]*256 + r[5]; 24 0 : ancount = r[6]*256 + r[7]; 25 0 : while( qdcount-- ) { 26 0 : while( p-r < rlen && *p-1U < 127 ) p++; 27 0 : if( p>r+rlen-6 ) 28 0 : return -1; 29 0 : p += 5 + !!*p; 30 0 : } 31 0 : while( ancount-- ) { 32 0 : while( p-r < rlen && *p-1U < 127 ) p++; 33 0 : if( p>r+rlen-12 ) 34 0 : return -1; 35 0 : p += 1 + !!*p; 36 0 : len = p[8]*256 + p[9]; 37 0 : if( len+10 > r+rlen-p ) return -1; 38 0 : if( callback( ctx, p[1], p+10, len, r, rlen ) < 0 ) return -1; 39 0 : p += 10 + len; 40 0 : } 41 0 : return 0; 42 0 : }