Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Third Party Musl
提交
4b877369
T
Third Party Musl
项目概览
OpenHarmony
/
Third Party Musl
大约 1 年 前同步成功
通知
37
Star
125
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
Third Party Musl
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
You need to sign in or sign up before continuing.
提交
4b877369
编写于
9月 29, 2011
作者:
R
Rich Felker
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix various bugs in path and error handling in execvp/fexecve
上级
5f814682
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
29 addition
and
18 deletion
+29
-18
src/process/execvp.c
src/process/execvp.c
+25
-17
src/process/fexecve.c
src/process/fexecve.c
+4
-1
未找到文件。
src/process/execvp.c
浏览文件 @
4b877369
...
...
@@ -2,33 +2,41 @@
#include <string.h>
#include <unistd.h>
#include <errno.h>
extern
char
**
__environ
;
#include <limits.h>
int
execvp
(
const
char
*
file
,
char
*
const
argv
[])
{
const
char
*
p
,
*
z
,
*
path
=
getenv
(
"PATH"
);
int
l
;
size_t
l
,
k
;
errno
=
ENOENT
;
if
(
!*
file
)
return
-
1
;
if
(
strchr
(
file
,
'/'
))
return
execv
e
(
file
,
argv
,
__environ
);
return
execv
(
file
,
argv
);
/* FIXME: integer overflows */
if
(
!
path
)
path
=
"/usr/local/bin:/bin:/usr/bin"
;
l
=
strlen
(
file
)
+
strlen
(
path
)
+
2
;
k
=
strnlen
(
file
,
NAME_MAX
+
1
);
if
(
k
>
NAME_MAX
)
{
errno
=
ENAMETOOLONG
;
return
-
1
;
}
l
=
strnlen
(
path
,
PATH_MAX
-
1
)
+
1
;
for
(
p
=
path
;
p
&&
*
p
;
p
=
z
)
{
char
b
[
l
];
for
(
p
=
path
;
;
p
=
z
)
{
char
b
[
l
+
k
+
1
];
z
=
strchr
(
p
,
':'
);
if
(
z
)
{
memcpy
(
b
,
p
,
z
-
p
);
b
[
z
++-
p
]
=
0
;
}
else
strcpy
(
b
,
p
);
strcat
(
b
,
"/"
);
strcat
(
b
,
file
);
if
(
!
access
(
b
,
X_OK
))
return
execve
(
b
,
argv
,
__environ
);
if
(
!
z
)
z
=
p
+
strlen
(
p
);
if
(
z
-
p
>=
l
)
{
if
(
!*
z
++
)
break
;
continue
;
}
memcpy
(
b
,
p
,
z
-
p
);
b
[
z
-
p
]
=
'/'
;
memcpy
(
b
+
(
z
-
p
)
+
(
z
>
p
),
file
,
k
+
1
);
execv
(
b
,
argv
);
if
(
errno
!=
ENOENT
)
return
-
1
;
if
(
!*
z
++
)
break
;
}
errno
=
ENOENT
;
return
-
1
;
}
src/process/fexecve.c
浏览文件 @
4b877369
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
int
fexecve
(
int
fd
,
char
*
const
argv
[],
char
*
const
envp
[])
{
static
const
char
proc
[]
=
"/proc/self/fd/%d"
;
char
buf
[
sizeof
proc
+
3
*
sizeof
(
int
)];
snprintf
(
buf
,
sizeof
buf
,
proc
,
fd
);
return
execve
(
buf
,
argv
,
envp
);
execve
(
buf
,
argv
,
envp
);
if
(
errno
==
ENOENT
)
errno
=
EBADF
;
return
-
1
;
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录