尝试通过libnl和通用网络链接发送抽象数据时出错

马修斯

当我运行以下代码时,我尝试使用libnl和通用netlink发送抽象数据:

struct nl_msg *msg;
struct nl_data *abstract;
int err = -1;

if ((msg = nlmsg_alloc()) == NULL)
    return err;

if ((genlmsg_put(msg, ctrl->pid, NL_AUTO_SEQ, ctrl->genl_family, 
        0, NLM_F_REQUEST, CREATE_STATE, KLUA_VERSION) == NULL))
    return err;

if ((err = nla_put_string(msg, STATE_NAME, cmd->name)))
    return err;

if ((err = nl_send_auto(ctrl->sock, msg)) < 0)
    return err;

nlmsg_free(msg);

内核很好地接收了消息。但是,如果我为此更改此代码:

struct nl_msg *msg;
struct nl_data *abstract;
int err = -1;

if ((msg = nlmsg_alloc()) == NULL)
    return err;

if ((abstract = nl_data_alloc(cmd, sizeof(struct klua_nl_state))) == NULL)
    return err;

if ((genlmsg_put(msg, ctrl->pid, NL_AUTO_SEQ, ctrl->genl_family, 
        0, NLM_F_REQUEST, CREATE_STATE, KLUA_VERSION) == NULL))
    return err;
    
nla_put_data(msg, TEST_ATTR, abstract);

if ((err = nl_send_auto(ctrl->sock, msg)) < 0)
    return err;

nlmsg_free(msg);

顺便说一句,我TEST_ATTR的定义为:

[TEST_ATTR] = {.type = NLA_UNSPEC}

如果仅更改消息的有效负载,为什么内核没有收到我的消息?如何通过通用netlink和libnl发送抽象数据?

伊德·阿赫克(Yd Ahhrk)

从Linux 5.2开始,内核的属性验证器函数(validate_nla())包含一个条件条件实质上禁止NLA_UNSPEC使用。

我不确定是否可以禁用该验证。validate_nla() 硬代码 validateas的主要用户NL_VALIDATE_STRICT,其中包含NL_VALIDATE_UNSPEC

但是无论如何,我建议您不要使用NLA_UNSPEC未经适当的序列化发送C结构。等待发生的灾难。C有一个陷阱,叫做“数据结构填充”要点是允许C编译器在任何结构的成员之间引入垃圾。因此,当您声明时:

struct test {
    __u16 a;
    __u32 b;
};

从技术上讲,允许编译器在实现过程中将其更改为类似

struct test {
    __u16 a;
    unsigned char garbage[2];
    __u32 b;
};

看到问题了吗?如果内核模块和用户空间客户端是由不同的编译器生成的,或者由相同的编译器生成的,但是它们的标志略有不同,甚至是由同一编译器的稍有不同的版本生成的,则结构可能会有所不同,并且内核将收到垃圾,无论如何更正您的代码外观。

使用嵌套属性而不是NLA_UNSPEC他们会为您调整位置。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

网络链接和通用网络链接协议

来自分类Dev

通过“通用数据库”连接Pentaho用户控制台和MongoDB时出错

来自分类Dev

尝试通过php从json响应url获取数据时出错

来自分类Dev

尝试使用Python通过API访问数据时出错

来自分类Dev

尝试通过php从json响应url获取数据时出错

来自分类Dev

通过 Socket TCP/IP 发送数据时出错

来自分类Dev

尝试通过存储在数据库中的有效电子邮件和密码登录时出错

来自分类Dev

尝试启动测试网络时出错

来自分类Dev

尝试构建神经网络时出错

来自分类Dev

通过Openerp 7“社交网络”应用发送附件时出错,但在发送普通消息时工作正常

来自分类Dev

netlink,链接到libnl-3和libnl-1

来自分类Dev

尝试通过 Firebase 函数使用 Facebook Messenger 平台发送消息时出错

来自分类Dev

尝试在python的Beatutifulsoap中尝试仅通过网络抓取获取文本时打印标签和元素

来自分类Dev

尝试从mongodb中获取数据时出错:发送标头后无法设置标头

来自分类Dev

尝试通过 HTTPS 访问 API 时,React Native Android 应用程序的发布版本出现“通用网络错误”

来自分类Dev

尝试通过Homebrew安装R时出错

来自分类Dev

尝试通过Playonlinux安装LoL时出错

来自分类Dev

通过 tcp 网络发送数据包

来自分类Dev

尝试创建数据库时出错:建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误

来自分类Dev

尝试通过 python 在线 POST 到 SQLite 数据库时出错

来自分类Dev

通用编程:尝试将值放入EnumMap时出错

来自分类Dev

尝试从数据帧和向量列表中取消列出数据帧时出错

来自分类Dev

F#:尝试通过接口复制和更新记录时出错

来自分类Dev

使用LibUsb在Java中通过USB发送数据时出错(未找到实体)

来自分类Dev

通过Ajax将JSOn数据发送到PHP时出错

来自分类Dev

BigQuery在尝试查询数据时出错?

来自分类Dev

尝试从数据库检索时出错

来自分类Dev

尝试处理Wikipedia数据时出错

来自分类Dev

尝试将数据插入MySQL时出错

Related 相关文章

  1. 1

    网络链接和通用网络链接协议

  2. 2

    通过“通用数据库”连接Pentaho用户控制台和MongoDB时出错

  3. 3

    尝试通过php从json响应url获取数据时出错

  4. 4

    尝试使用Python通过API访问数据时出错

  5. 5

    尝试通过php从json响应url获取数据时出错

  6. 6

    通过 Socket TCP/IP 发送数据时出错

  7. 7

    尝试通过存储在数据库中的有效电子邮件和密码登录时出错

  8. 8

    尝试启动测试网络时出错

  9. 9

    尝试构建神经网络时出错

  10. 10

    通过Openerp 7“社交网络”应用发送附件时出错,但在发送普通消息时工作正常

  11. 11

    netlink,链接到libnl-3和libnl-1

  12. 12

    尝试通过 Firebase 函数使用 Facebook Messenger 平台发送消息时出错

  13. 13

    尝试在python的Beatutifulsoap中尝试仅通过网络抓取获取文本时打印标签和元素

  14. 14

    尝试从mongodb中获取数据时出错:发送标头后无法设置标头

  15. 15

    尝试通过 HTTPS 访问 API 时,React Native Android 应用程序的发布版本出现“通用网络错误”

  16. 16

    尝试通过Homebrew安装R时出错

  17. 17

    尝试通过Playonlinux安装LoL时出错

  18. 18

    通过 tcp 网络发送数据包

  19. 19

    尝试创建数据库时出错:建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误

  20. 20

    尝试通过 python 在线 POST 到 SQLite 数据库时出错

  21. 21

    通用编程:尝试将值放入EnumMap时出错

  22. 22

    尝试从数据帧和向量列表中取消列出数据帧时出错

  23. 23

    F#:尝试通过接口复制和更新记录时出错

  24. 24

    使用LibUsb在Java中通过USB发送数据时出错(未找到实体)

  25. 25

    通过Ajax将JSOn数据发送到PHP时出错

  26. 26

    BigQuery在尝试查询数据时出错?

  27. 27

    尝试从数据库检索时出错

  28. 28

    尝试处理Wikipedia数据时出错

  29. 29

    尝试将数据插入MySQL时出错

热门标签

归档