首页 > 系统相关 >全局数组未加锁访问溢出导致才内存

全局数组未加锁访问溢出导致才内存

时间:2023-09-25 11:58:19浏览次数:48  
标签:加锁 casa knet int smm 内存 linux event 溢出

在客户那里发现有些数据包被错误的转到了standby SMM上,后面查看 proc 发现是 knet.ko 中的 role 字段被踩
后面再检查发现有三个字段都被踩:

zyc@fish smm_arm64 (/≧▽≦)/ ~/do_not_remove/aarch64-marvell-linux-gnu-nm linux-casa-knet.ko | grep smm_role
0000000006925110 B smm_role
zyc@fish smm_arm64 (/≧▽≦)/ ~/do_not_remove/aarch64-marvell-linux-gnu-nm linux-casa-knet.ko | grep 0000000692
0000000006925108 B protocol_flap_enabled     <====== 0x26f8bdc8
000000000692510c B product_type              <====== 0x133000b7
0000000006925110 B smm_role                  <====== 0xffff8002
0000000006925118 B knet_active_ifs
0000000006925120 B knet_ifs

后面的knet_active_ifsknet_ifs看起来是没问题的
也就是说,内存被踩的时候是从低往高处踩,那么就看看 protocol_flap_enabled 前面的是什么

zyc@fish smm_arm64 (/≧▽≦)/ ~/do_not_remove/aarch64-marvell-linux-gnu-nm linux-casa-knet.ko | grep -E  "000000069[12]|000000068[abcdef]"
..........
00000000068a10ec b tx_free_buf_to_user_cnt
00000000068a1078 b tx_oom_drops
00000000068a5108 B casa_events
0000000006925108 B protocol_flap_enabled
000000000692510c B product_type
0000000006925110 B smm_role
0000000006925120 B knet_ifs
0000000006925118 B knet_active_ifs

casa_events 是一个全局数组,占用内存 0.5M

检查代码发现, casa_events 只在一个函数中会修改其内容:

 540 void
 541 casa_event_tracer(int trace_id, unsigned int arg0, unsigned int arg1)
 542 {
 543     int i;
 544     casa_event_t *ev;
 545     struct timespec event_time;
 546
 547     // if not tracing (like when dumping), stop tracing
 548     if (!casa_tracing_events)
 549     {
 550         return;
 551     }
 552
 553     i = casa_cur_event++;       <--- casa_cur_event 指向最新的一个空槽位。 先赋值,再自增
 554     casa_cur_event &= (CASA_EVENT_ARRAY_SIZE-1);       <--- 超出界限,则回滚到起点
 555
 556     // set the time
 557     ev = &casa_events[i];
 558     getnstimeofday(&event_time);
 559
 560     ev->time_ns = event_time.tv_nsec;
 561
 562     // fill in event id (with time seconds)
 563     ev->event = (unsigned int)(trace_id | (event_time.tv_sec << 16));
 564
 565     // fill in the data
 566     ev->data1 = (unsigned int)arg0;
 567     ev->data2 = (unsigned int)arg1;
 568
 569 }


事实上,确实就是上面553、554两行出的问题
casa_cur_event == CASA_EVENT_ARRAY_SIZE 指向最后一个槽位时
如果两个线程同时去执行 553、554行
线程 A 执行完 553 行但是还没有执行 554 行时,此刻casa_cur_event 就会越出边界
如果这时调度到线程 B 去运行,那么执行 553 行时,得到的 i 也就是越界的,就直接踩到了后面的三个字段

标签:加锁,casa,knet,int,smm,内存,linux,event,溢出
From: https://www.cnblogs.com/fallenmoon/p/17727623.html

相关文章

  • 【C语言菜鸟知识】——动态内存管理
    --------------------------------------------------------------------------------------------------------------------- 1、栈在全局变量是分配在内存中的静态储存区,非静态的局部变量是分配在内存中的动态储存区,这个储存区就是栈的区域。2、堆在内存中允许建立内存动态分......
  • C语言动态内存分配
      #include<iostream>#include<stdio.h>int*removeDuplicates(intnumsSize){//malloc是常用的动态内存分配int*arr=(int*)malloc(numsSize*sizeof(int));returnarr;}intmain(){intnumsSize=10;int*arr;a......
  • 7.7 实现进程内存读写
    内存进程读写可以让我们访问其他进程的内存空间并读取或修改其中的数据。这种技术通常用于各种调试工具、进程监控工具和反作弊系统等场景。在Windows系统中,内存进程读写可以通过一些API函数来实现,如OpenProcess、ReadProcessMemory和WriteProcessMemory等。这些函数提供了一种通......
  • win32汇编-80386的内存分页机制
     读者可以注意到,在实模式下寻址的时候,“段寄存器+偏移地址”经过转换计算以后得到的地址是“物理地址”,也就是在物理内存中的实际地址。而保护模式下,“段选择器+偏移地址”转换后的地址被称为“线性地址”而不是“物理地址”。那么,线性地址就是物理地址吗?答案可能是“是”,也可......
  • crash —— 获取系统内存使用统计数据
    crash>kmem-iPAGESTOTALPERCENTAGETOTALMEM197646761754GB----FREE33983015129.6GB17%ofTOTALMEMUSED163663746624.3GB82%ofTOTALMEMSHARED139137......
  • crash —— 获取物理内存布局信息
    crash>mach-mPHYSICALADDRESSRANGETYPE0000000000000000-0000000000001000E820_RESERVED0000000000001000-000000000006e000E820_RAM000000000006e000-0000000000070000E820_RESERVED0000000000070000-00000000000a0000E820_RAM0......
  • Go指针探秘:深入理解内存与安全性
    Go指针为程序员提供了对内存的深入管理能力,同时确保了代码的安全性。本文深入探讨了Go指针的基础概念、操作、深层理解及其特性与限制。通过深入了解其设计哲学和应用,我们可以更好地利用Go的强大功能。关注公众号【TechLeadCloud】,分享互联网架构、云服务技术的全维度知识。作......
  • 使用mtrace追踪JVM堆外内存泄露
    原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,非公众号转载保留此声明。简介在上篇文章中,介绍了使用tcmalloc或jemalloc定位native内存泄露的方法,但使用这个方法相当于更换了原生内存分配器,以至于使用时会有一些顾虑。经过一些摸索,发现glibc自带的ptmalloc2分配器,也提供有追踪内......
  • 内存对齐
    1、内存对齐是什么?​ 计算机的内存就好像一个很大的数组,访问内存的时候,看似是可以从任何地址开始,但是实际上为了简化形成处理器和内存系统之间的接口设计,不同类型的数据会按照一定的规则在空间上排列,并不是按照顺序一个接着一个排放,这种排放方式就是内存对齐。2、需要内存对齐的......
  • JS深入学习笔记 - 第三章.变量作用域与内存
    1.原始值和引用值ECMScript变量包含两种不同类型是数据:原始值和引用值。原始值:最简单的数据。有6中原始值:Undefined、Null、Boolean、Number、String和Symbol。原始值是按值访问。引用值:由多个值构成的对象。三大引用类型:1.object2.Array类型3.Function类型。引用值是保存在......