【问题标题】:does safe_strcpy in samba checks if the memory allocation was successfulsamba 中的 safe_strcpy 检查内存分配是否成功
【发布时间】:2015-10-05 12:28:57
【问题描述】:

我正在尝试使用safe_strcpy 将一个字符串复制到另一个字符串,但似乎找不到函数定义。

这是在做什么:

 char value[256];
 char *var = NULL;
 var =  malloc(sizeof(value));
 safe_strcpy(var, value, strlen(value)+1);

我想知道我是否需要为 malloc 添加错误处理,还是 safe_stcpy 会处理它?

【问题讨论】:

  • 你需要检查malloc是否成功。
  • 是否有一些缺失的代码实际上将数据放入value
  • 您应该能够在 SAMBA 源代码的 lib/util/util_str.c 中找到 safe_strcpy() 实现,假设您使用的 SAMBA 版本使用它。艾莉森在 2011 年删除了 safe_strcpy() 和朋友:git.samba.org/…
  • 是的。我没有在这里添加代码来初始化值。感谢您提供指向 samba 存储库的指针。我想我必须为 malloc 添加安全检查。
  • 几个注意事项:maxlength 参数应该是目标缓冲区的大小,不包括终止 null 的空间。所以在你的例子中它应该是sizeof(value)-1。此外,根据删除safe_strcpy() 的提交评论,SAMBA 切换到使用strlcpy()。在我看来,这可能是使用您自己的代码而不是safe_strcpy() 的好方法,因为strlcpy()strcpy() 的一个相当广泛使用的“安全”替代方案,并且有一个有据可查/易于理解的界面。

标签: c malloc samba strcpy


【解决方案1】:

在 samba 的 current source code 中,我找不到任何名为“safe_strcpy”的函数。我可以找到alpha_strcpy,在 cmets 中被描述为“Paranoid strcpy”,我怀疑它已经取代了你之前询问的函数,尽管它有一个不同的原型和一个额外的参数。

无论如何:

char *alpha_strcpy(char *dest,
                   const char *src,
                   const char *other_safe_chars,
                   size_t maxlength)
{
        size_t len, i;

        if (!dest) {
                smb_panic("ERROR: NULL dest in alpha_strcpy");
        }

所以,这个函数至少会检查 dest,但如果它为 null,它会恐慌,这可能不是你想要的。

我建议你总是自己检查 malloc 的返回值。

【讨论】:

  • 你是对的。 “safe_strcpy”似乎已被“strlcpy”取代。在旧版本中找到“safe_strcpy”:当目标字符串没有分配内存时,它显然返回“null”。所以我想我必须添加支票。
猜你喜欢
  • 2018-11-29
  • 2010-12-07
  • 2023-04-07
  • 1970-01-01
  • 2011-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多