compassd / dcompass

A high-performance programmable DNS component aiming at robustness, speed, and flexibility
GNU General Public License v3.0
283 stars 23 forks source link

[BUG] Domain matcher 会 match 父级域名? #97

Closed tywtyw2002 closed 1 year ago

tywtyw2002 commented 1 year ago

如果Domain.txt 内容如下

tejia.taobao.com
temai.m.taobao.com
tui.taobao.com

taobao.comm.taobao.com 会被错误的match上。

看了下代码,看起来逻辑上没有判读,域名label中间的lvs 是过路节点还是需要match的节点。

    pub fn matches(&self, domain: &Dname<Bytes>) -> bool {
        let mut ptr = &self.root;
        for lv in domain.iter().rev() {
            if ptr.next_lvs.is_empty() {
                break;
            }
            // If not empty...
            ptr = match ptr.next_lvs.get(&lv.to_owned()) {
                Some(v) => v,
                None => return false,
            };
        }
        true
    }
tywtyw2002 commented 1 year ago

还是有问题,这回应该match的域名不match了。

这句话看起来不会被执行。 比如说 tejia.taobao.com,最后一次loop把ptr 指向 tejia,然后loop 就结束了。

            if ptr.next_lvs.is_empty() {
                return true;
            }

看样子好像只能在levelnode里面加个bool了。

LEXUGE commented 1 year ago

最新的 build 已经修复了,test case 里也有 cover。