fix: fix potential memory leaks

This commit is contained in:
DreamMaoMao 2026-04-06 15:39:39 +08:00
parent e3a0d54b9a
commit e83a9dff82

View file

@ -863,7 +863,6 @@ int32_t spawn_shell(const Arg *arg) {
} }
int32_t spawn(const Arg *arg) { int32_t spawn(const Arg *arg) {
if (!arg->v) if (!arg->v)
return 0; return 0;
@ -876,28 +875,21 @@ int32_t spawn(const Arg *arg) {
dup2(STDERR_FILENO, STDOUT_FILENO); dup2(STDERR_FILENO, STDOUT_FILENO);
setsid(); setsid();
// 2. 解析参数 // 2. 对整个参数字符串进行单词展开
char *argv[64]; wordexp_t p;
int32_t argc = 0; if (wordexp(arg->v, &p, 0) != 0) {
char *token = strtok((char *)arg->v, " "); wlr_log(WLR_DEBUG, "mango: wordexp failed for '%s'\n", arg->v);
while (token != NULL && argc < 63) { _exit(EXIT_FAILURE);
wordexp_t p;
if (wordexp(token, &p, 0) == 0) {
argv[argc++] = p.we_wordv[0];
} else {
argv[argc++] = token;
}
token = strtok(NULL, " ");
} }
argv[argc] = NULL;
// 3. 执行命令 // 3. 执行命令p.we_wordv 已经是 argv 数组)
execvp(argv[0], argv); execvp(p.we_wordv[0], p.we_wordv);
// 4. execvp 失败时:打印错误并直接退出(避免 coredump // 4. execvp 失败时:打印错误,释放 wordexp 资源,然后退出
wlr_log(WLR_DEBUG, "mango: execvp '%s' failed: %s\n", argv[0], wlr_log(WLR_DEBUG, "mango: execvp '%s' failed: %s\n", p.we_wordv[0],
strerror(errno)); strerror(errno));
_exit(EXIT_FAILURE); // 使用 _exit 避免缓冲区刷新等操作 wordfree(&p); // 释放 wordexp 分配的内存
_exit(EXIT_FAILURE);
} }
return 0; return 0;
} }