fix(svcd): load_conf 用局部tmp, *s=tmp 后 argv[] 指针悬垂指向已销毁栈帧(tmp.exec/argbuf)导致 /proc/pid/cmdline 错乱 — 抽 svc_rebuild_argv 重建 argv[] 指向 s 自身成员 (agent-167)
This commit is contained in:
1 parent
365cf0f1c0
commit
408b165ba3
2 files changed
+13
-4
No files matched your search
Binary file not shown.
@@ -297,6 +297,17 @@ static void apply_field(svc_t *s, const char *k, const char *v)
|
||||
/* 未知键忽略(前向兼容) */
|
||||
}
|
||||
|
||||
/* 重建 s->argv[]:argv[0]=exec、argv[i+1]=argbuf[i]、末尾 NULL。
|
||||
* s->argv 是指针数组;load_conf 里它指向 s 自身的 exec/argbuf(栈局部 tmp 亦成立),
|
||||
* 但 scan_and_reconcile 用 *s=tmp 整体拷贝时只复制指针值,仍指向已销毁的 tmp 栈帧。
|
||||
* 故赋值后必须重定位到 s 自己的 exec/argbuf,否则 execv 传出的 argv[0]/cmdline 读到脏值。 */
|
||||
static void svc_rebuild_argv(svc_t *s)
|
||||
{
|
||||
s->argv[0] = s->exec;
|
||||
for (int i = 0; i < s->argc; i++) s->argv[i + 1] = s->argbuf[i];
|
||||
s->argv[s->argc + 1] = NULL;
|
||||
}
|
||||
|
||||
/* 解析单个 .conf 到 svc(name=basename)。成功返回 0。 */
|
||||
static int load_conf(const char *path, const char *name, svc_t *s)
|
||||
{
|
||||
@@ -339,10 +350,7 @@ static int load_conf(const char *path, const char *name, svc_t *s)
|
||||
strcmp(s->trigger, "wifi-up"))
|
||||
safe_strcpy(s->trigger, sizeof s->trigger, "card-mount");
|
||||
|
||||
/* argv[0]=exec;随后 args */
|
||||
s->argv[0] = s->exec;
|
||||
for (int i = 0; i < s->argc; i++) s->argv[i + 1] = s->argbuf[i];
|
||||
s->argv[s->argc + 1] = NULL;
|
||||
svc_rebuild_argv(s);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -709,6 +717,7 @@ static void scan_and_reconcile(void)
|
||||
int keep_user = s->user_stopped;
|
||||
int keep_state = s->state;
|
||||
*s = tmp;
|
||||
svc_rebuild_argv(s); /* 重定位 argv[] 到 s 自身成员,防悬垂指针 */
|
||||
s->restart_count = keep_count;
|
||||
s->last_exit_status = keep_exit;
|
||||
s->has_exit = keep_has;
|
||||
|
||||
Reference in new issue
Block a user