admin管理员组

文章数量:1635684

问题现象

出错代码如下

sprintf(fullpath, "%s/%s%s%s%s", path, ecertdir, "/Resp-", cert_id, ".oer");
sprintf(fullpath, "%s/%s%s", fullpath, cert_id, ".oer");

valgrind报错如下:

==83141== Source and destination overlap in mempcpy(0x1ffefffd00, 0x1ffefffd00, 52)
==83141==    at 0x4843740: mempcpy (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==83141==    by 0x526E1D8: _IO_default_xsputn (genops.c:386)
==83141==    by 0x526E1D8: _IO_default_xsputn (genops.c:370)
==83141==    by 0x525327B: __vfprintf_internal (vfprintf-internal.c:1688)
==83141==    by 0x5261278: __vsprintf_internal (iovsprintf.c:95)
==83141==    by 0x5309EDA: __sprintf_chk (sprintf_chk.c:40)
==83141==    by 0x11E56D: sprintf (stdio2.h:36)
==83141==    by 0x11E56D: Cert_Req_Save (https_client.c:1940)
==83141==    by 0x11E56D: main (https_client.c:2779)

问题分析

使用sprintf拼接字符串时,将后面的拼接结果要存入fullpath,对几个变量长度进行对比,因为几个标量为字符型数组,因此分配了静态空间,发现fullpath小于拼接后的字符空间长度,造成了异常。

解决方法

保证最终的空间比拼接好的字符串空间更大,这里的字符串空间不是字符串实际所占空间,是为这个字符串所分配的空间。

本文标签: destinationSourcemempcpyoverlap