@@ -37,15 +37,15 @@ MODULE_ALIAS("ip6t_dns");
37
37
#define XT_PARAM const struct xt_match_param
38
38
#define HOTDROP (par ) *par->hotdrop = true
39
39
#endif
40
-
41
40
static bool dns_mt (const struct sk_buff * skb , XT_PARAM * par , int16_t offset ) {
42
41
const struct dns_h * dh ; // dns header working pointer
43
42
struct dns_h _dnsh ; // dns header buffer
44
43
45
44
uint16_t qlen ; // qname length, MAX 255
46
- uint16_t mlen ; // match qname length, MAX 255
47
45
uint8_t llen ; // label length, MAX 63
48
46
47
+ int q , m ; // tmp var
48
+
49
49
uint8_t * qname ; // qname working pointer
50
50
uint8_t _qname [XT_DNS_MAXSIZE ]; // qname buffer
51
51
uint16_t qtype ; // qtype buffer
@@ -106,18 +106,18 @@ static bool dns_mt(const struct sk_buff *skb, XT_PARAM *par, int16_t offset) {
106
106
DEBUG_PRINT ("not match RCODE" );
107
107
return false;
108
108
}
109
- DEBUG_PRINT ("xt_dns: bit check done " );
109
+ DEBUG_PRINT ("xt_dns: done checking bits. " );
110
110
if ((dnsinfo -> setflags & XT_DNS_FLAG_QNAME ) ||
111
111
(dnsinfo -> maxsize < XT_DNS_FLAG_QNAME_MAXSIZE )) {
112
- DEBUG_PRINT ("xt_dns: start parse qname" );
112
+ DEBUG_PRINT ("xt_dns: start parse qname. " );
113
113
qname = _qname ;
114
114
qlen = 0 ;
115
115
llen = 255 ;
116
116
while (llen != 0 && qlen < XT_DNS_MAXSIZE ) {
117
117
// read label size
118
118
if (skb_copy_bits (skb , offset , & llen , sizeof (uint8_t )) < 0 ||
119
119
llen > XT_DNS_LABEL_MAXSIZE ) {
120
- DEBUG_PRINT ("xt_dns: invalid label len." );
120
+ DEBUG_PRINT ("xt_dns: invalid label len %u->%x." , offset , llen );
121
121
HOTDROP (par );
122
122
return false;
123
123
}
@@ -148,19 +148,17 @@ static bool dns_mt(const struct sk_buff *skb, XT_PARAM *par, int16_t offset) {
148
148
return false;
149
149
}
150
150
if (dnsinfo -> setflags & XT_DNS_FLAG_QNAME ) {
151
- qlen = mlen = 0 ;
152
- DEBUG_PRINT ("start qname matching." );
153
- while (qlen < XT_DNS_MAXSIZE && qname [qlen ] != 0 &&
154
- dnsinfo -> qname [mlen ] != 0 ) {
155
- if (tolower (qname [qlen ++ ]) != dnsinfo -> qname [mlen ++ ]) {
156
- if (dnsinfo -> rmatch ) {
157
- mlen = 0 ;
158
- } else {
159
- break ;
160
- }
151
+ q = qlen - 1 ;
152
+ m = dnsinfo -> qname_size - 1 ;
153
+ DEBUG_PRINT ("start qname matching. q=%d,m=%d" , q , m );
154
+ while (q >= 0 && m >= 0 ) {
155
+ DEBUG_PRINT ("qm: qname[%d]=%d match[%d] = %d" , q , qname [q ], m ,
156
+ dnsinfo -> qname [m ]);
157
+ if (tolower (qname [q -- ]) != dnsinfo -> qname [m -- ]) {
158
+ break ;
161
159
}
162
160
}
163
- if (!FWINVDNS ((qname [ qlen ] == 0 && dnsinfo -> qname [ mlen ] == 0 ),
161
+ if (!FWINVDNS ((m < 0 && ( q < 0 || dnsinfo -> rmatch ) ),
164
162
XT_DNS_FLAG_QNAME )) {
165
163
DEBUG_PRINT ("not match qname" );
166
164
return false;
0 commit comments