我有一个指向GtkEntry的指针,该指针包含用户输入的密码。我想在完成GtkEntry之后在存储块上调用Libsodium的安全memset函数。这是一个无效的示例,概述了我要执行的操作:
GtkEntry *entry = GTK_ENTRY(gtk_builder_get_object(builder, "passwordEntry"));
...
const gchar *password = gtk_entry_get_text(entry);
gint length = gtk_entry_get_text_length(entry);
...
sodium_memzero(password, length); // Undefined behaviour
API为gtk_entry_get_text()
指定:
此字符串指向窗口小部件内部分配的存储空间,不得释放,修改或存储。
因此,我想知道是否可以在不调用未定义行为的情况下做到这一点?
GtkEntry
使用GtkEntryBuffer
来管理文本。当GtkEntryBuffer
中存储的文本(或关联的GtkEntry
)被释放时(即,在g_object_unref
上),该文本将清零。请参见其源代码1和2。
如果您想使用更好的安全缓冲区来保存密码,可以尝试GcrSecureEntryBuffer。但这需要您的项目依赖gcr。
或者,如果您确实想使用libsodium,则可以将GtkEntryBuffer
子类化,并自行进行内存管理,并使用该缓冲区创建GtkEntry
。