Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Nanos 可能的溢出问题 #3

Closed
PicaPica427 opened this issue Jul 27, 2023 · 4 comments
Closed

Nanos 可能的溢出问题 #3

PicaPica427 opened this issue Jul 27, 2023 · 4 comments

Comments

@PicaPica427
Copy link

nanos-lite/src/loader.c
void context_kload(PCB *pcb, void (*entry)(void *), void *arg){}
120行
karea.end = &pcb->cp + STACK_SIZE; // &pcb->cp 步长不为1 可能会超出对应pcb的stack

以及context_uload中也存在这个问题

@Googol2002
Copy link
Owner

可以介绍一下溢出的具体原因吗,我已经太久没有阅读这个项目了。悲.jpg

@PicaPica427
Copy link
Author

  • 对内核栈的访问可能会导致覆盖掉部分数据段内容

    • 4个PCB 每个PCB的大小是32768B (宏STACK_SIZE为(4096 *8 == 32768))

    • &pcb->cp 类型为Context** 步长为一个指针大小(4)

  •   /* nanos-lite/src/loader.c 118 */
      Area karea;
      karea.start = &pcb->cp;
      karea.end = &pcb->cp + STACK_SIZE;            /* + STACK_SIZE  --->  + (STACK_SIZE*4)
    
    • 这一段的目的 可能是想构造对应PCB地址空间的边界 但是错误的步长导致了构造的地址空间是错误的
    • 比如对于PCB[0],构造的地址空间末尾会是实际上PCB[3]的末尾,而PCB[1,2,3]则会覆盖掉数据区的其他东西
  • 建议修改为karea.end = (void*)(&pcb->cp) + STACK_SIZE;

@Googol2002
Copy link
Owner

我觉得你说的有道理,的确是我的代码写出了问题,位移算错了。
当然,从另一方面看,对于会暴露这个错误的程序行为,似乎同样会导致正确代码发生“爆栈”,崩溃是无法避免的。
我认同应该修改代码,但我不太敢修改这个代码,毕竟我已经没法再测试修改后的代码是否正确了。
希望和你有相同困惑的人可以看到这条ISSUE。

@Googol2002 Googol2002 pinned this issue Jul 29, 2023
@Googol2002
Copy link
Owner

已经把这条ISSUE Pin上了,应该会方便后来者读到。

@Googol2002 Googol2002 changed the title 可能的溢出问题 Nanos 可能的溢出问题 Mar 28, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants