summaryrefslogtreecommitdiff
path: root/components/lwp/lwp_syscall.c
diff options
context:
space:
mode:
authorgeniusgogo <[email protected]>2023-04-28 11:49:05 +0800
committerGitHub <[email protected]>2023-04-28 11:49:05 +0800
commit18c452e4dd0ae37c6c12e0f7282cd3d82a4d9968 (patch)
tree3bcd44ec983893c7149bd0619c470f2f5694e989 /components/lwp/lwp_syscall.c
parent1e66a25eef168bd60a6bb65d94a92648b67afd58 (diff)
fix lwp _load_script. (#7405)
Diffstat (limited to 'components/lwp/lwp_syscall.c')
-rw-r--r--components/lwp/lwp_syscall.c47
1 files changed, 26 insertions, 21 deletions
diff --git a/components/lwp/lwp_syscall.c b/components/lwp/lwp_syscall.c
index 428779a938..373a36b779 100644
--- a/components/lwp/lwp_syscall.c
+++ b/components/lwp/lwp_syscall.c
@@ -1926,10 +1926,9 @@ quit:
}
#define INTERP_BUF_SIZE 128
-static char *_load_script(const char *filename, struct lwp_args_info *args)
+static char *_load_script(const char *filename, void *old_page, struct lwp_args_info *args)
{
- void *page = NULL;
- char *new_page;
+ char *new_page = NULL;
int fd = -RT_ERROR;
int len;
char interp[INTERP_BUF_SIZE];
@@ -1947,7 +1946,10 @@ static char *_load_script(const char *filename, struct lwp_args_info *args)
{
goto quit;
}
-
+ /*
+ * match find file header the first line.
+ * eg: #!/bin/sh
+ */
if ((interp[0] != '#') || (interp[1] != '!'))
{
goto quit;
@@ -2002,23 +2004,26 @@ static char *_load_script(const char *filename, struct lwp_args_info *args)
if (i_arg)
{
new_page = _insert_args(1, &i_arg, args);
- rt_pages_free(page, 0);
- page = new_page;
- if (!page)
+ if (!new_page)
{
goto quit;
}
+ rt_pages_free(old_page, 0);
+ old_page = new_page;
}
new_page = _insert_args(1, &i_name, args);
- rt_pages_free(page, 0);
- page = new_page;
+ if (!new_page)
+ {
+ goto quit;
+ }
+ rt_pages_free(old_page, 0);
quit:
if (fd >= 0)
{
close(fd);
}
- return page;
+ return new_page;
}
int load_ldso(struct rt_lwp *lwp, char *exec_name, char *const argv[], char *const envp[])
@@ -2107,33 +2112,33 @@ int load_ldso(struct rt_lwp *lwp, char *exec_name, char *const argv[], char *con
args_info.size = size;
new_page = _insert_args(1, &exec_name, &args_info);
- rt_pages_free(page, 0);
- page = new_page;
- if (!page)
+ if (!new_page)
{
SET_ERRNO(ENOMEM);
goto quit;
}
+ rt_pages_free(page, 0);
+ page = new_page;
i_arg = "-e";
new_page = _insert_args(1, &i_arg, &args_info);
- rt_pages_free(page, 0);
- page = new_page;
- if (!page)
+ if (!new_page)
{
SET_ERRNO(ENOMEM);
goto quit;
}
+ rt_pages_free(page, 0);
+ page = new_page;
i_arg = "ld.so";
new_page = _insert_args(1, &i_arg, &args_info);
- rt_pages_free(page, 0);
- page = new_page;
- if (!page)
+ if (!new_page)
{
SET_ERRNO(ENOMEM);
goto quit;
}
+ rt_pages_free(page, 0);
+ page = new_page;
if ((aux = lwp_argscopy(lwp, args_info.argc, args_info.argv, args_info.envp)) == NULL)
{
@@ -2312,12 +2317,12 @@ sysret_t sys_execve(const char *path, char *const argv[], char *const envp[])
args_info.size = size;
while (1)
{
- new_page = _load_script(path, &args_info);
+ new_page = _load_script(path, page, &args_info);
if (!new_page)
{
break;
}
- rt_pages_free(page, 0);
+
page = new_page;
path = args_info.argv[0];
}