V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
username1919810
V2EX  ›  程序员

有用过 libradcli 库的朋友吗?遇到一个诡异的问题:在 C/C++代码中表现不同

  •  
  •   username1919810 · 355 天前 · 2045 次点击
    这是一个创建于 355 天前的主题,其中的信息可能已经有所发展或是发生改变。

    rc_avpair_add 这个函数。
    想把一个 repo 的代码从 C++转成 C (目标平台编译器对 CPP 支持不好),遇到了这个诡异的问题
    库: https://github.com/radcli/radcli/
    原型:

    VALUE_PAIR *rc_avpair_add(rc_handle const *rh, VALUE_PAIR **list, uint32_t attrid, void const *pval, int len, uint32_t vendorspec);
    

    C++代码片段:

    // C++ code example where the issue does not occur
    constexpr int kVendorSoftbank = 22197;
    constexpr int kSbBBMac = 1;
    // ... (other relevant code)
    if (rc_avpair_add(rh.get(), &send_raw, kSbBBMac, mac.c_str(), mac.size(), kVendorSoftbank) == nullptr) {
        // Error handling
    }
    

    C 代码片段:

    // C code example where the issue occurs
    const int kVendorSoftbank = 22197;
    const int kSbBBMac = 1;
    // ... (other relevant code)
    if (rc_avpair_add(rh, &send_raw, kSbBBMac, mac, strlen(mac), kVendorSoftbank) == NULL) {
        // Error handling
    }
    

    C 代码里 vendorspec 只有指定为 0(VENDOR_NONE)时才能正确执行,其他无论设置成什么值都返回失败 NULL ,C++代码就能正确执行。

    C 代码: https://github.com/missing233/sofutobanku/blob/master/c/radius.c
    C++代码: https://github.com/missing233/sofutobanku/blob/master/cpp/radius.cc

    求 C 语言大手子解答(

    17 条回复    2023-12-11 18:22:28 +08:00
    geelaw
        1
    geelaw  
       355 天前 via iPhone
    两段代码里 response 不同,C++ 的代码里 response 以 1 开始,C 代码里以 0 开始。我不知道这个库的逻辑,因此在第一个发现的不同处就假设两段代码不等价且可以导致后续的行为不同。
    liberize
        2
    liberize  
       355 天前 via Android
    mac 地址可能包含'\0'吧,不能用 strlen
    tianshilei1992
        3
    tianshilei1992  
       355 天前
    编个 debug 版本的 library 进去看看
    username1919810
        4
    username1919810  
    OP
       355 天前
    @geelaw #1 这个是生成 challenge 用的,和后面的东西无关😂
    username1919810
        5
    username1919810  
    OP
       355 天前
    @liberize #2 我试过改成-1 让库自己去算,没用 而且是只要不写 vendorspec 就没问题
    geelaw
        6
    geelaw  
       355 天前 via iPhone
    @username1919810 #4 https://devblogs.microsoft.com/oldnewthing/20130201-00/?p=5383

    > I’m going to pose a puzzle with almost no clues, and you get to propose solutions, and I’ll say whether or not you’re right.

    推荐不要放上来这么一大坨代码让网友帮你调试。你有没有试过:复制 C 的代码(绝大多数情况下这也是有效的 C++ 代码),每次修改一点点,然后检查哪个修改令行为不同?你有没有试过制造最小复现情况?
    username1919810
        7
    username1919810  
    OP
       350 天前
    @geelaw #6 全都试过了 orz C 里带上 vendorspec 就 GG
    PTLin
        8
    PTLin  
       350 天前
    extern "C" {}里 include 试试?我看你代码里没这么搞。
    username1919810
        9
    username1919810  
    OP
       350 天前
    @PTLin #8 我是想把 C++代码转成纯 C 啊。。
    leonshaw
        10
    leonshaw  
       350 天前
    配置文件一样吗?有可能是 dictionary vendor 定义有问题
    leonshaw
        11
    leonshaw  
       350 天前
    看了下你代码,

    const char *dictionary_path = rc_conf_str(rh, "dictionary");

    隐藏了全局的

    const char dictionary_path[] = "./dictionary.softbank";
    PTLin
        12
    PTLin  
       350 天前
    @username1919810 抱歉看错了,下个 syslog-ng 看一下 log 吧,这个库 rc_acpair_add 出错会用 syslog 打 log
    username1919810
        13
    username1919810  
    OP
       350 天前
    @leonshaw #10 配置文件是完全一样的,在仓库的/etc/里那个 dictionary.softbank 就是😂
    username1919810
        14
    username1919810  
    OP
       350 天前
    @leonshaw #11 还真是这里的问题,抄代码时候没注意抄混了😂感谢。
    现在就只剩一个问题了,莫名其妙最后多了一个 NAS-IPv6-Address 的 attribute
    cnbatch
        15
    cnbatch  
       350 天前
    NAS-IPv6-Address 看起来应该是 RFC 3262 的内容:
    https://datatracker.ietf.org/doc/html/rfc3162
    在 Section 6 直接就提到有 NAS-IPv6-Address 这个 attribute
    cnbatch
        16
    cnbatch  
       350 天前
    打字打快了,应该是 RFC 3162
    (早知道直接复制粘贴)
    username1919810
        17
    username1919810  
    OP
       348 天前
    @cnbatch #15 是这个,但是用 rc_avpair_remove 都移除不掉这个 attribute😂
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2467 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 15:51 · PVG 23:51 · LAX 07:51 · JFK 10:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.