Linux内核中d_path函数返回的指针是否需要手动释放?
d_path返回指针的内存管理问题解答
核心结论
- 不需要单独释放
d_path返回的ret_ptr指针,直接对ret_ptr调用kfree必然报错 ret_ptr指向的内存就是你手动通过kmalloc申请的tpath缓冲区的内部区域,你只需要在路径使用完毕后释放tpath首地址即可
具体原理说明
d_path的实现逻辑是从你传入的缓冲区末尾开始倒序填充路径字符串,因此返回的指针是缓冲区中路径字符串的起始地址,不一定等于你传入的缓冲区首地址tpath,但一定落在你申请的1024字节内存范围内。
你调用kfree(ret_ptr)报错的原因是内核的内存分配器只认可kmalloc返回的首地址作为释放参数,传入偏移后的地址会触发内存校验错误。
你现有代码的bug说明
你当前的代码逻辑存在严重的野指针问题:你在返回ret_ptr前就调用了kfree(tpath)释放了缓冲区,此时返回的ret_ptr指向已经被回收的内存,后续访问该指针会触发不可预期的内核错误。
正确的实现逻辑可以参考两种方案:
- 让函数同时返回缓冲区首地址和路径指针,调用者使用完路径后释放缓冲区首地址即可
- 改为让调用者提前分配缓冲区传入函数,由调用者自行管理缓冲区生命周期
内容的提问来源于stack exchange,提问作者Porcupine Andrew
相关产品推荐
相关产品推荐

