mirror of
https://github.com/DreamMaoMao/maomaowm.git
synced 2026-04-06 07:15:53 -04:00
fix: fix potential memory leaks
This commit is contained in:
parent
e3a0d54b9a
commit
e83a9dff82
1 changed files with 11 additions and 19 deletions
|
|
@ -863,7 +863,6 @@ int32_t spawn_shell(const Arg *arg) {
|
|||
}
|
||||
|
||||
int32_t spawn(const Arg *arg) {
|
||||
|
||||
if (!arg->v)
|
||||
return 0;
|
||||
|
||||
|
|
@ -876,28 +875,21 @@ int32_t spawn(const Arg *arg) {
|
|||
dup2(STDERR_FILENO, STDOUT_FILENO);
|
||||
setsid();
|
||||
|
||||
// 2. 解析参数
|
||||
char *argv[64];
|
||||
int32_t argc = 0;
|
||||
char *token = strtok((char *)arg->v, " ");
|
||||
while (token != NULL && argc < 63) {
|
||||
wordexp_t p;
|
||||
if (wordexp(token, &p, 0) == 0) {
|
||||
argv[argc++] = p.we_wordv[0];
|
||||
} else {
|
||||
argv[argc++] = token;
|
||||
}
|
||||
token = strtok(NULL, " ");
|
||||
// 2. 对整个参数字符串进行单词展开
|
||||
wordexp_t p;
|
||||
if (wordexp(arg->v, &p, 0) != 0) {
|
||||
wlr_log(WLR_DEBUG, "mango: wordexp failed for '%s'\n", arg->v);
|
||||
_exit(EXIT_FAILURE);
|
||||
}
|
||||
argv[argc] = NULL;
|
||||
|
||||
// 3. 执行命令
|
||||
execvp(argv[0], argv);
|
||||
// 3. 执行命令(p.we_wordv 已经是 argv 数组)
|
||||
execvp(p.we_wordv[0], p.we_wordv);
|
||||
|
||||
// 4. execvp 失败时:打印错误并直接退出(避免 coredump)
|
||||
wlr_log(WLR_DEBUG, "mango: execvp '%s' failed: %s\n", argv[0],
|
||||
// 4. execvp 失败时:打印错误,释放 wordexp 资源,然后退出
|
||||
wlr_log(WLR_DEBUG, "mango: execvp '%s' failed: %s\n", p.we_wordv[0],
|
||||
strerror(errno));
|
||||
_exit(EXIT_FAILURE); // 使用 _exit 避免缓冲区刷新等操作
|
||||
wordfree(&p); // 释放 wordexp 分配的内存
|
||||
_exit(EXIT_FAILURE);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue