我有一个指向GtkEntry的指针,该指针包含用户输入的密码。在完成GtkEntry之后,我想在内存块上调用block的安全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()
指定如下:
此字符串指向小部件中的内部分配存储,不能释放、修改或存储。
所以,我想知道,如果不调用未定义的行为,这是否有可能做到呢?
发布于 2020-03-21 17:17:51
GtkEntry
使用GtkEntryBuffer
来管理文本。当GtkEntryBuffer
(或相关的GtkEntry
)被释放时,存储在g_object_unref
中的文本为零(即在g_object_unref
上),请参阅其源代码1和2。
如果您想使用更好的安全缓冲区来保存密码,可以尝试GcrSecureEntryBuffer。但这需要您的项目依赖gcr。
或者,如果您确实想要使用libsodium,您可以将GtkEntryBuffer
子类并自行进行内存管理,并使用该缓冲区创建一个GtkEntry
。
https://stackoverflow.com/questions/60790467
复制