使用Epoll收UDP包时recvmsg触发'unaligned tcache chunk detected'错误但recv正常
报错根因分析
你遇到的unaligned tcache chunk detected错误是非法改写堆内存结构触发的glibc堆校验异常,和_buffer无关,问题出在你未正确初始化msghdr结构体:
- 你声明
msghdr msg后没有做清零操作,仅赋值了部分字段,msg_name字段是栈上的随机野指针,同时你又主动设置了msg.msg_namelen = sizeof(sockaddr_in)。recvmsg执行时会按照msg_namelen的长度,把UDP报文的源地址信息写入msg_name指向的随机内存地址,直接破坏了堆内存中的tcache管理结构,触发了系统报错。 - 如果你不需要获取对端地址,需要主动将
msg_name设为NULL,msg_namelen设为0;如果需要获取对端地址,要提前在栈或堆上分配sockaddr_in结构体空间,把结构体地址赋值给msg_name字段后再调用recvmsg。 - 建议所有网络相关的结构体在使用前都用
memset做清零初始化,避免未赋值字段的随机值引发异常。
换成recv后正常的原因
recv接口不需要传递msghdr结构体,不存在野指针写非法内存的逻辑,因此不会破坏堆结构,程序运行正常。
内容的提问来源于stack exchange,提问作者user997112
相关产品推荐
相关产品推荐

