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 12 : ) { 17 12 : int qdcount, ancount; 18 12 : int len; 19 : 20 12 : if( rlen<12 ) return -1; 21 12 : if( (r[3]&15) ) return 0; 22 12 : uchar const * p = r+12; 23 12 : qdcount = r[4]*256 + r[5]; 24 12 : ancount = r[6]*256 + r[7]; 25 21 : while( qdcount-- ) { 26 72 : while( p-r < rlen && *p-1U < 127 ) p++; 27 12 : if( p-r>=rlen || p>r+rlen-5-!!*p ) 28 3 : return -1; 29 9 : p += 5 + !!*p; 30 9 : } 31 18 : while( ancount-- ) { 32 9 : while( p-r < rlen && *p-1U < 127 ) p++; 33 9 : if( p>r+rlen-12 ) 34 0 : return -1; 35 9 : p += 1 + !!*p; 36 9 : len = p[8]*256 + p[9]; 37 9 : if( len+10 > r+rlen-p ) return -1; 38 9 : if( callback( ctx, p[1], p+10, len, r, rlen ) < 0 ) return -1; 39 9 : p += 10 + len; 40 9 : } 41 9 : return 0; 42 9 : }