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:
MeowOS committed 2026-08-31 01:14:12 +08:00
1 parent 365cf0f1c0
commit 408b165ba3
2 files changed
+13 -4

No files matched your search

+13 -4
View File
@@ -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;