事故代码如下:
475 /* fill certificate subject. */
476 subj = (char *)malloc((strlen(conf.cert_subj) + 1) * sizeof(char));
477 if (subj == NULL) {
478 printf("%s[%d]: malloc failed!\n", __FUNCTION__, __LINE__);
479 return ERROR;
480 }
482 memset(subj, 0, strlen((conf.cert_subj)) * sizeof(char));
483
484 memcpy(subj, conf.cert_subj, strlen((conf.cert_subj)) * sizeof(char));
485
486 //subj[strlen(conf.cert_subj)] = '\0';
487
488 printf("conf.cert_subj= [%d]: %s\n", (int)strlen(conf.cert_subj), conf.cert_subj);
489 printf("subj= [%d]: %s\n", (int)strlen(subj), subj);
输出异常:
conf.cert_subj= [54]: /C=CN/ST=Liaoning/L=Shenyang/O=abcdefg/OU=ABCD/CN=ABCD
subj= [58]: /C=CN/ST=Liaoning/L=Shenyang/O=abcdefg/OU=ABCD/CN=ABCDª˛
解决办法:
486 subj[strlen(conf.cert_subj)] = '\0';
输出正常:
conf.cert_subj= [54]: /C=CN/ST=Liaoning/L=Shenyang/O=abcdefg/OU=ABCD/CN=ABCD
subj= [54]: /C=CN/ST=Liaoning/L=Shenyang/O=abcdefg/OU=ABCD/CN=ABCD
总结:
在申请内存空间时,可以多出一个字节,如:
subj = (char *)malloc((strlen(conf.cert_subj) + 1) * sizeof(char));
在使用memcpy时,即便是使用strlen控制复制的长度,也会出现多复制内存的情况,因此在复制结束后一定要显示的在最后显示添加'\0'。
如:subj[strlen(conf.cert_subj)] = '\0';
在使用strncpy情况会好点!