如何用memset替换已废弃的_pam_overwrite宏?
如何用memset替换已废弃的_pam_overwrite宏?
别发愁,这个替换操作其实超简单,我给你一步步说清楚!
首先得搞明白_pam_overwrite到底是干啥的——它本质就是个用来清除敏感内存数据的宏,比如你程序里存过的密码、密钥这类不能留在内存里的内容,它会把目标内存区域的所有字节都覆盖成0,防止数据泄露。
现在要换成标准C库的memset,只需要对应好参数就行:
- 原来的
_pam_overwrite只需要传一个参数:你要清除的内存对象(比如缓冲区、结构体变量) - 而
memset需要三个参数:目标内存的指针、填充值(这里固定用0,和宏的效果完全一致)、要覆盖的字节数
给你举几个实际代码的替换例子:
如果你用的是固定大小的数组缓冲区:
原来的代码:char password_buf[128]; // ... 这里用了password_buf存密码 ... _pam_overwrite(password_buf);替换成memset后:
char password_buf[128]; // ... 这里用了password_buf存密码 ... memset(password_buf, 0, sizeof(password_buf));如果是动态分配的内存(比如用malloc申请的):
原来的代码:char *dynamic_pass = malloc(128); // ... 使用后 ... _pam_overwrite(dynamic_pass);替换的时候要记得你当初分配的大小(这里是128字节):
char *dynamic_pass = malloc(128); // ... 使用后 ... memset(dynamic_pass, 0, 128);如果是结构体类型的变量:
原来的代码:struct pam_sensitive_data my_data; // ... 操作数据后 ... _pam_overwrite(&my_data);替换成:
struct pam_sensitive_data my_data; // ... 操作数据后 ... memset(&my_data, 0, sizeof(my_data));
最后提个小注意点:一定要保证memset的第三个参数(字节数)是准确的,要是填小了会清不干净敏感数据,填大了就会越界写内存,搞出程序崩溃的问题哦!
备注:内容来源于stack exchange,提问作者ygoe
相关产品推荐
相关产品推荐

