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 语言大手子解答(
1
geelaw 355 天前 via iPhone
两段代码里 response 不同,C++ 的代码里 response 以 1 开始,C 代码里以 0 开始。我不知道这个库的逻辑,因此在第一个发现的不同处就假设两段代码不等价且可以导致后续的行为不同。
|
2
liberize 355 天前 via Android
mac 地址可能包含'\0'吧,不能用 strlen
|
3
tianshilei1992 355 天前
编个 debug 版本的 library 进去看看
|
4
username1919810 OP @geelaw #1 这个是生成 challenge 用的,和后面的东西无关😂
|
5
username1919810 OP @liberize #2 我试过改成-1 让库自己去算,没用 而且是只要不写 vendorspec 就没问题
|
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++ 代码),每次修改一点点,然后检查哪个修改令行为不同?你有没有试过制造最小复现情况? |
7
username1919810 OP @geelaw #6 全都试过了 orz C 里带上 vendorspec 就 GG
|
8
PTLin 350 天前
extern "C" {}里 include 试试?我看你代码里没这么搞。
|
9
username1919810 OP @PTLin #8 我是想把 C++代码转成纯 C 啊。。
|
10
leonshaw 350 天前
配置文件一样吗?有可能是 dictionary vendor 定义有问题
|
11
leonshaw 350 天前
看了下你代码,
const char *dictionary_path = rc_conf_str(rh, "dictionary"); 隐藏了全局的 const char dictionary_path[] = "./dictionary.softbank"; |
12
PTLin 350 天前
@username1919810 抱歉看错了,下个 syslog-ng 看一下 log 吧,这个库 rc_acpair_add 出错会用 syslog 打 log
|
13
username1919810 OP @leonshaw #10 配置文件是完全一样的,在仓库的/etc/里那个 dictionary.softbank 就是😂
|
14
username1919810 OP |
15
cnbatch 350 天前
NAS-IPv6-Address 看起来应该是 RFC 3262 的内容:
https://datatracker.ietf.org/doc/html/rfc3162 在 Section 6 直接就提到有 NAS-IPv6-Address 这个 attribute |
16
cnbatch 350 天前
打字打快了,应该是 RFC 3162
(早知道直接复制粘贴) |
17
username1919810 OP @cnbatch #15 是这个,但是用 rc_avpair_remove 都移除不掉这个 attribute😂
|