前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >昨天遇到collectd exec插件的bug,顺便发现他们不按套路出牌啊

昨天遇到collectd exec插件的bug,顺便发现他们不按套路出牌啊

作者头像
julyclyde
发布2023-12-18 15:51:36
1380
发布2023-12-18 15:51:36
举报
文章被收录于专栏:七月的夏天的博客

先说症状:

collectd exec插件调用的几个外部脚本,其中总会随机有一个缺少COLLECTD_HOSTNAME和COLLECTD_INTERVAL环境变量。

搜了一下是这个bug https://github.com/collectd/collectd/issues/3041

然后我好奇啊,就读了一下修改前后的代码,发现collectd不按套路出牌。

带有bug的版本:

先setenv()设置主进程自己的环境变量,然后尝试fork(),如果成功,在子进程里execvp();主进程重新unsetenv()恢复主进程自己的环境变量。在多个exec密集执行的时候,都会访问主进程的环境变量,会有race condition,偶尔会发生前一个exec插件刚unsetenv()然后后一个exec插件开始fork()的情况,丢失环境变量。

修复后的版本:

先fork(),在子进程里准备环境变量数组,尝试execvpe()带签署环境变量数组作为参数,执行新进程(execvpe()为GNU专有扩展),或者先设置extern char **environ指针指向准备好的数组,然后execvp()执行新进程直接继承。

别人家套路:

先准备环境变量数组,然后fork(),在子进程里execve()并使用前述环境变量数组作为参数。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-12-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档