gpt4 book ai didi

c - read() - 如果在包含递归循环的循环中使用,则检查缓冲区边界

转载 作者:行者123 更新时间:2023-12-02 02:48:58 24 4
gpt4 key购买 nike

我有这个代码并用 Flawinder 运行它,我在 read() 函数上得到这个输出:

Check buffer boundaries if used in a loop including recursive loops


任何人都可以看到问题吗?
#include <stdlib.h>
void func(int fd)
{

char *buf;
size_t len;
read(fd, &len, sizeof(len));

if (len > 1024)
return;
buf = malloc(len+1);
read(fd, buf, len);
buf[len] = '\0';
}

最佳答案

你应该检查 read() 的返回值想知道是否调用read()是成功还是失败或者如果 read()被信号中断,然后设置 errno .例如

ssize_t ret = read(fd, &len, sizeof len);
if( (ret == -1 || ret != sizeof len) {
/* error handling @TODO */
}

最重要的在这里
ret = read(fd, buf, len); /* read() may read less than len characters */ 
read()返回读取的字节数,而不是这个
buf[len] = '\0';


buf[ret] = '\0'; /* correct way */

示例代码
void func(int fd) { /* assume fd is a valid file descriptor */
char *buf = NULL;
size_t len;
errno = 0; /* set this to 0 */
ssize_t ret = read(fd, &len, sizeof len);
if( (ret == -1 || ret != sizeof len) {
/* error handling @TODO */
}
if (len > 1024) {
return;
}
buf = malloc(len+1);
if(buf == NULL) {
/* error handling @TODO */
}
ret = read(fd, buf, len);
if(ret!=-1) {
buf[ret] = '\0';
/* do something with buf and free it once usage is done*/
} free(buf); /* free the buf */
else { /* if read failed */
free(buf); /* free the buf */
}
}

关于c - read() - 如果在包含递归循环的循环中使用,则检查缓冲区边界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53020336/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com