如何通过 dbus 调用 varargs 函数?

Posted

技术标签:

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

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

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

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

提前致谢。

[我使用 DBus-GLib。]

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

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

以上是关于如何通过 dbus 调用 varargs 函数?的主要内容,如果未能解决你的问题,请参考以下文章

通过来自 Python 的 dbus 函数调用传递文件描述符(又名调用 flatpak 的 HostCommand)

如何通过 dbus-send 发送方法调用?

在发出 dbus-send 命令后,如何使用 C 调用方法?

用于 C 的 Varargs `ELEM` 宏

如何使用 qt-dbus 将错误返回到 dbus?

如何在 Qt DBus 调用中从 QDBusMessage 中提取返回的数据?