【问题标题】:How to call a varargs function via dbus?如何通过 dbus 调用 varargs 函数?
【发布时间】:2011-10-20 12:03:33
【问题描述】:

如何通过 dbus 调用 varargs 函数,比如 printf?

服务端用 C 编写,客户端用 Python 编写。

我的问题是如何编写 XML 规范文件?以及如何编写我的 GObject?

提前致谢。

[我使用 DBus-GLib。]

【问题讨论】:

    标签: c dbus


    【解决方案1】:

    无法以编程方式使用不同数量和类型的参数调用可变参数函数。您可以使用相应的“v”函数(vprintf 等),但无法让 va_list 从外部代码传递给它们并通过 DBus 传递。

    无论如何,您确实需要重新考虑您的设计。使用不是 100% 由您的程序控制的格式字符串调用 printf 是不安全的。传递客户端提供的格式字符串是一个灾难公式,因为如果格式字符串与参数不匹配,printf 会调用 未定义的行为。在几乎所有实际情况下,这将意味着特权提升漏洞

    【讨论】:

    • 我明白了.. 但是如何使用“v”函数?
    • 当 args 来自外语甚至跨 DBus 的另一个进程时,无法使用“v”函数,因为您无法生成 va_list。以您尝试做的方式调用printf 是完全错误的。如果预先知道格式字符串的类型,请使用包装函数来获取这些确切类型并验证格式字符串是否与它们匹配(这本身并不是一件容易的事!)。如果事先不知道格式字符串的类型,并且由外部程序提供,那么您所做的事情从根本上来说是不安全的。
    • 顺便说一句,你为什么不直接从 Python 调用 snprintf 的等价物,然后通过 DBus 传递结果字符串??
    猜你喜欢
    • 2021-11-18
    • 1970-01-01
    • 2010-11-18
    • 2019-12-12
    • 2019-01-10
    • 2013-10-11
    • 1970-01-01
    • 1970-01-01
    • 2023-01-16
    相关资源
    最近更新 更多