一个free异常引发的异常

news/2024/7/7 19:10:36

有同事反馈说自己的线程不工作,查看堆栈发现其打印如下:

#0  0x00007f291f72e7be in __lll_lock_wait_private () from /lib64/libc.so.6
#1  0x00007f291f6c2e4e in _L_lock_9925 () from /lib64/libc.so.6
#2  0x00007f291f6c1101 in free () from /lib64/libc.so.6
#3  0x00000000004b5b85 in pcap_close (p=0x561cab0) at ./pcap.c:1888
#4  0x000000000041f811 in ExitClean () at rp.c:5722
#5  0x00007f291f678655 in __run_exit_handlers () from /lib64/libc.so.6
#6  0x00007f291f6786a5 in exit () from /lib64/libc.so.6
#7  0x000000000041f590 in SigHandler (signo=6, info=0x7f291ed49d70, context=0x7f291ed49c40) at rp.c:5654
#8  <signal handler called>
#9  0x00007f291f675875 in raise () from /lib64/libc.so.6
#10 0x00007f291f676e51 in abort () from /lib64/libc.so.6
#11 0x00007f291f6b68bf in __libc_message () from /lib64/libc.so.6
#12 0x00007f291f6bc0c8 in malloc_printerr () from /lib64/libc.so.6
#13 0x00007f291f6c110c in free () from /lib64/libc.so.6
#14 0x000000000042b1ef in reqReleasePacketInfo (pPacketInfo=0x5628230) at rp.c:11033
#15 0x0000000000438542 in DnsPacketCaptureEntry (ptConfig=0x741cc0 <atParamConfig>, ethIndex=0, threadIndex=0) at rp.c:16316
#16 0x000000000043954b in DnsPacketCaptureTask (ptThrPara=0x55cbf60 <TaskParaDnsCapConfig>) at rp.c:16715
#17 0x00007f292005e806 in start_thread () from /lib64/libpthread.so.0
#18 0x00007f291f72167d in clone () from /lib64/libc.so.6
#19 0x0000000000000000 in ?? ()

根据代码逻辑,发现其free的时候出现异常,导致了信号的产生,并且被SigHandler 处理,由于注册了退出清理函数,

atexit(ExitClean);

这个 ExitClean 会调用 pcap_close 来清理pcap_open 申请的一些资源,很悲剧的是,这些资源释放的时候,获取的锁看起来被占用了,导致我们exit的时候,被阻塞了。exit的时候,还没有走到

_exit()函数,就阻塞在锁的等待上面。

这些锁被占用的概率,按照glibc的内存管理方式,不应该这么久,唯一的可能就是,这些锁的状态被异常覆盖了,导致认为被占用了。

反过头来看,一开始的free为什么异常,就能理解这个逻辑了。

查看对应时间点附近的系统日志,发现了很多报文的校验和错误,走查我们的代码,发现三层的错误并没有排查,而是直接采用拷贝的模式,

而拷贝传入的长度,是没有检验的长度,导致了我们malloc的内存越界。这种越界,最终在free的时候被发现。

 

改进点结论:

1.校验pacp_next返回的pcap_pkthdr中的len成员,大于我们用户的缓存区时,不要越界拷贝,解决malloc的越界,然后free就正常了。

2.进程工作与否,不能简单通过查看进程存在来判断。

转载于:https://www.cnblogs.com/10087622blog/p/10370713.html


http://lihuaxi.xjx100.cn/news/244670.html

相关文章

房价与阶级

最近一线城市房价似乎大幅度飙升&#xff0c;有人说这是崩溃前夕的疯狂。今晨在微博上看到&#xff0c;王健林说未来20年一线城市的房价会持续上涨&#xff0c;评论区里被谩骂淹没。关于大城市房价&#xff0c;我没有能力做任何分析和预测。只对崩溃论发表一些想法。前几天逛汽…

高性能ORM框架XLinq功能详细介绍

之前简单介绍了XLinq的一些功能&#xff0c;有很多功能都没有提到&#xff0c;现在给XLinq加了一些功能&#xff0c;这次把所有功能都介绍一遍。 设计目标 易用性 在使用一个框架的时候 应该没几个人会喜欢写一大堆的配置文件吧 也应该没几个人会喜欢为了完成一个小功能却需要写…

Java面试题及答案整理( 2022年最新版,持续更新)

发现网上很多Java面试题都没有答案&#xff0c;所以花了很长时间搜集整理出来了这套Java面试题大全~ 这套互联网 Java 工程师面试题包括了&#xff1a;MyBatis、ZK、Dubbo、EL、Redis、MySQL、并发编程、Java面试、Spring、微服务、Linux、Springboot、SpringCloud、MQ、Kafka…

EOS与以太坊有哪些区别?

想知道更多关于区块链技术知识&#xff0c;请百度【链客区块链技术问答社区】 链客&#xff0c;有问必答&#xff01;&#xff01;EOS与以太坊有哪些区别&#xff1f; 以太坊是一个专门为开发和运行去中心化应用&#xff08;DAPP&#xff09;搭建的智能合约平台&#xff1b;EOS…

ListView和数据适配器SimpleAdapter例子

为什么80%的码农都做不了架构师&#xff1f;>>> 一&#xff1a;activity_main.xml文件&#xff0c;主屏幕 <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android…

使用ajax实现多个查询条件功能以及下拉分页

2018-8月18日 1.效果图&#xff1a; 2.前台html <!--搜索栏--> <div class" row " style"padding:0 2% 0 7%;"> <div class"col-md-5 col-sm-5 col-xs-5 "> <div class"…

(剑指Offer)面试题54:表示数值的字符串

题目&#xff1a; 请实现一个函数用来判断字符串是否表示数值&#xff08;包括整数和小数&#xff09;。例如&#xff0c;字符串"100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14"…