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

358 天前
 username1919810

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 语言大手子解答(

2045 次点击
所在节点    程序员
17 条回复
geelaw
358 天前
两段代码里 response 不同,C++ 的代码里 response 以 1 开始,C 代码里以 0 开始。我不知道这个库的逻辑,因此在第一个发现的不同处就假设两段代码不等价且可以导致后续的行为不同。
liberize
357 天前
mac 地址可能包含'\0'吧,不能用 strlen
tianshilei1992
357 天前
编个 debug 版本的 library 进去看看
username1919810
357 天前
@geelaw #1 这个是生成 challenge 用的,和后面的东西无关😂
username1919810
357 天前
@liberize #2 我试过改成-1 让库自己去算,没用 而且是只要不写 vendorspec 就没问题
geelaw
357 天前
@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
352 天前
@geelaw #6 全都试过了 orz C 里带上 vendorspec 就 GG
PTLin
352 天前
extern "C" {}里 include 试试?我看你代码里没这么搞。
username1919810
352 天前
@PTLin #8 我是想把 C++代码转成纯 C 啊。。
leonshaw
352 天前
配置文件一样吗?有可能是 dictionary vendor 定义有问题
leonshaw
352 天前
看了下你代码,

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

隐藏了全局的

const char dictionary_path[] = "./dictionary.softbank";
PTLin
352 天前
@username1919810 抱歉看错了,下个 syslog-ng 看一下 log 吧,这个库 rc_acpair_add 出错会用 syslog 打 log
username1919810
352 天前
@leonshaw #10 配置文件是完全一样的,在仓库的/etc/里那个 dictionary.softbank 就是😂
username1919810
352 天前
@leonshaw #11 还真是这里的问题,抄代码时候没注意抄混了😂感谢。
现在就只剩一个问题了,莫名其妙最后多了一个 NAS-IPv6-Address 的 attribute
cnbatch
352 天前
NAS-IPv6-Address 看起来应该是 RFC 3262 的内容:
https://datatracker.ietf.org/doc/html/rfc3162
在 Section 6 直接就提到有 NAS-IPv6-Address 这个 attribute
cnbatch
352 天前
打字打快了,应该是 RFC 3162
(早知道直接复制粘贴)
username1919810
350 天前
@cnbatch #15 是这个,但是用 rc_avpair_remove 都移除不掉这个 attribute😂

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/997347

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX