Displaying 16 results from an estimated 16 matches for "setstackmark".
2020 Mar 28
0
[klibc:update-dash] dash: eval: avoid leaking memory associated with redirections
...--git a/usr/dash/eval.c b/usr/dash/eval.c
index 5074aa94..bba0e7f8 100644
--- a/usr/dash/eval.c
+++ b/usr/dash/eval.c
@@ -200,8 +200,12 @@ evaltree(union node *n, int flags)
{
int checkexit = 0;
int (*evalfn)(union node *, int);
+ struct stackmark smark;
unsigned isor;
int status = 0;
+
+ setstackmark(&smark);
+
if (n == NULL) {
TRACE(("evaltree(NULL) called\n"));
goto out;
@@ -317,6 +321,8 @@ exexit:
exraise(EXEXIT);
}
+ popstackmark(&smark);
+
return exitstatus;
}
@@ -396,14 +402,12 @@ evalfor(union node *n, int flags)
struct arglist arglist;
union nod...
2019 Jan 25
0
[klibc:update-dash] [BUILTIN] Handle embedded NULs correctly in printf
...+ ret = xasprintf(sp, f, array[0], func); \
+ break; \
+ case 0: \
+ ret = xasprintf(sp, f, func); \
+ break; \
+ } \
+ ret; \
+})
+
+
+static int print_escape_str(const char *f, int *param, int *array, char *s)
+{
+ struct stackmark smark;
+ char *p, *q;
+ int done;
+ int len;
+ int total;
+
+ setstackmark(&smark);
+ done = conv_escape_str(s, &p);
+ q = stackblock();
+ len = p - q;
+
+ p = makestrspace(len, p);
+ memset(p, 'X', len - 1);
+ p[len - 1] = 0;
+
+ q = stackblock();
+ total = ASPF(&p, f, p);
+
+ len = strchrnul(p, 'X') - p;
+ memcpy(p + len, q, strchrnul(p + len...
2020 Mar 28
0
[klibc:update-dash] dash: [BUILTIN] Handle embedded NULs correctly in printf
...+ ret = xasprintf(sp, f, array[0], func); \
+ break; \
+ case 0: \
+ ret = xasprintf(sp, f, func); \
+ break; \
+ } \
+ ret; \
+})
+
+
+static int print_escape_str(const char *f, int *param, int *array, char *s)
+{
+ struct stackmark smark;
+ char *p, *q;
+ int done;
+ int len;
+ int total;
+
+ setstackmark(&smark);
+ done = conv_escape_str(s, &p);
+ q = stackblock();
+ len = p - q;
+
+ p = makestrspace(len, p);
+ memset(p, 'X', len - 1);
+ p[len - 1] = 0;
+
+ q = stackblock();
+ total = ASPF(&p, f, p);
+
+ len = strchrnul(p, 'X') - p;
+ memcpy(p + len, q, strchrnul(p + len...
2019 Jan 25
0
[klibc:update-dash] eval: Return status in eval functions
...backcmd *);
#else
-STATIC void evalcommand(union node *, int);
+STATIC int evalcommand(union node *, int);
#endif
STATIC int evalbltin(const struct builtincmd *, int, char **, int);
STATIC int evalfun(struct funcnode *, int, char **, int);
@@ -170,11 +170,13 @@ evalstring(char *s, int flags)
setstackmark(&smark);
status = 0;
- while ((n = parsecmd(0)) != NEOF) {
- evaltree(n, flags & ~(parser_eof() ? 0 : EV_EXIT));
+ for (; (n = parsecmd(0)) != NEOF; popstackmark(&smark)) {
+ int i;
+
+ i = evaltree(n, flags & ~(parser_eof() ? 0 : EV_EXIT));
if (n)
- status = exitstatus;...
2020 Mar 28
0
[klibc:update-dash] dash: eval: Return status in eval functions
...backcmd *);
#else
-STATIC void evalcommand(union node *, int);
+STATIC int evalcommand(union node *, int);
#endif
STATIC int evalbltin(const struct builtincmd *, int, char **, int);
STATIC int evalfun(struct funcnode *, int, char **, int);
@@ -170,11 +170,13 @@ evalstring(char *s, int flags)
setstackmark(&smark);
status = 0;
- while ((n = parsecmd(0)) != NEOF) {
- evaltree(n, flags & ~(parser_eof() ? 0 : EV_EXIT));
+ for (; (n = parsecmd(0)) != NEOF; popstackmark(&smark)) {
+ int i;
+
+ i = evaltree(n, flags & ~(parser_eof() ? 0 : EV_EXIT));
if (n)
- status = exitstatus;...
2019 Jan 25
0
[klibc:update-dash] [EVAL] Fix use-after-free in dotrap/evalstring
...changed, 4 insertions(+), 2 deletions(-)
diff --git a/usr/dash/eval.c b/usr/dash/eval.c
index da39136d..755136e2 100644
--- a/usr/dash/eval.c
+++ b/usr/dash/eval.c
@@ -160,6 +160,7 @@ evalstring(char *s, int flags)
struct stackmark smark;
int status;
+ s = sstrdup(s);
setinputstring(s);
setstackmark(&smark);
@@ -171,7 +172,9 @@ evalstring(char *s, int flags)
if (evalskip)
break;
}
+ popstackmark(&smark);
popfile();
+ stunalloc(s);
return status;
}
diff --git a/usr/dash/histedit.c b/usr/dash/histedit.c
index b27d6294..94465d78 100644
--- a/usr/dash/histedit.c
+++ b/usr...
2019 Jan 25
0
[klibc:update-dash] builtin: Fix echo performance regression
...nsertions(+), 7 deletions(-)
diff --git a/usr/dash/bltin/printf.c b/usr/dash/bltin/printf.c
index 1f1fbde7..fe055fd2 100644
--- a/usr/dash/bltin/printf.c
+++ b/usr/dash/bltin/printf.c
@@ -100,20 +100,25 @@ static int print_escape_str(const char *f, int *param, int *array, char *s)
int total;
setstackmark(&smark);
- done = conv_escape_str(s, &p);
- q = stackblock();
- len = p - q;
+ done = conv_escape_str(s, &q);
+ p = stackblock();
+ len = q - p;
+ total = len - 1;
+
+ if (f[1] == 's')
+ goto easy;
- p = makestrspace(len, p);
- memset(p, 'X', len - 1);
- p[len - 1] =...
2019 Jan 25
0
[klibc:update-dash] eval: Restore input files in evalcommand
...lags)
#endif
{
struct localvar_list *localvar_stop;
+ struct parsefile *file_stop;
struct redirtab *redir_stop;
struct stackmark smark;
union node *argp;
@@ -722,6 +723,7 @@ evalcommand(union node *cmd, int flags)
TRACE(("evalcommand(0x%lx, %d) called\n", (long)cmd, flags));
setstackmark(&smark);
localvar_stop = pushlocalvars();
+ file_stop = parsefile;
back_exitstatus = 0;
cmdentry.cmdtype = CMDBUILTIN;
@@ -896,6 +898,7 @@ out:
if (cmd->ncmd.redirect)
popredir(execcmd);
unwindredir(redir_stop);
+ unwindfiles(file_stop);
unwindlocalvars(localvar_stop);
if...
2020 Mar 28
0
[klibc:update-dash] dash: [EVAL] Fix use-after-free in dotrap/evalstring
...changed, 4 insertions(+), 2 deletions(-)
diff --git a/usr/dash/eval.c b/usr/dash/eval.c
index e6f6cd5c..adf05fde 100644
--- a/usr/dash/eval.c
+++ b/usr/dash/eval.c
@@ -160,6 +160,7 @@ evalstring(char *s, int flags)
struct stackmark smark;
int status;
+ s = sstrdup(s);
setinputstring(s);
setstackmark(&smark);
@@ -171,7 +172,9 @@ evalstring(char *s, int flags)
if (evalskip)
break;
}
+ popstackmark(&smark);
popfile();
+ stunalloc(s);
return status;
}
diff --git a/usr/dash/histedit.c b/usr/dash/histedit.c
index b27d6294..94465d78 100644
--- a/usr/dash/histedit.c
+++ b/usr...
2020 Mar 28
0
[klibc:update-dash] dash: builtin: Fix echo performance regression
...nsertions(+), 7 deletions(-)
diff --git a/usr/dash/bltin/printf.c b/usr/dash/bltin/printf.c
index 1f1fbde7..fe055fd2 100644
--- a/usr/dash/bltin/printf.c
+++ b/usr/dash/bltin/printf.c
@@ -100,20 +100,25 @@ static int print_escape_str(const char *f, int *param, int *array, char *s)
int total;
setstackmark(&smark);
- done = conv_escape_str(s, &p);
- q = stackblock();
- len = p - q;
+ done = conv_escape_str(s, &q);
+ p = stackblock();
+ len = q - p;
+ total = len - 1;
+
+ if (f[1] == 's')
+ goto easy;
- p = makestrspace(len, p);
- memset(p, 'X', len - 1);
- p[len - 1] =...
2020 Mar 28
0
[klibc:update-dash] dash: memalloc: Avoid looping in growstackto
...n)
+ growstackblock(len);
return stackblock();
}
diff --git a/usr/dash/memalloc.h b/usr/dash/memalloc.h
index b348d9cc..b9c63dac 100644
--- a/usr/dash/memalloc.h
+++ b/usr/dash/memalloc.h
@@ -55,7 +55,6 @@ void stunalloc(pointer);
void pushstackmark(struct stackmark *mark, size_t len);
void setstackmark(struct stackmark *);
void popstackmark(struct stackmark *);
-void growstackblock(void);
void *growstackstr(void);
char *growstackto(size_t len);
char *makestrspace(size_t, char *);
2020 Mar 28
0
[klibc:update-dash] dash: eval: Restore input files in evalcommand
...lags)
#endif
{
struct localvar_list *localvar_stop;
+ struct parsefile *file_stop;
struct redirtab *redir_stop;
struct stackmark smark;
union node *argp;
@@ -722,6 +723,7 @@ evalcommand(union node *cmd, int flags)
TRACE(("evalcommand(0x%lx, %d) called\n", (long)cmd, flags));
setstackmark(&smark);
localvar_stop = pushlocalvars();
+ file_stop = parsefile;
back_exitstatus = 0;
cmdentry.cmdtype = CMDBUILTIN;
@@ -896,6 +898,7 @@ out:
if (cmd->ncmd.redirect)
popredir(execcmd);
unwindredir(redir_stop);
+ unwindfiles(file_stop);
unwindlocalvars(localvar_stop);
if...
2020 Mar 28
0
[klibc:update-dash] dash: memalloc: Add growstackto helper
...eft >= newlen)
- break;
- growstackblock();
- }
- return stackblock() + len;
+ return growstackto(len + newlen) + len;
}
char *
diff --git a/usr/dash/memalloc.h b/usr/dash/memalloc.h
index 4b5be46c..b348d9cc 100644
--- a/usr/dash/memalloc.h
+++ b/usr/dash/memalloc.h
@@ -57,6 +57,7 @@ void setstackmark(struct stackmark *);
void popstackmark(struct stackmark *);
void growstackblock(void);
void *growstackstr(void);
+char *growstackto(size_t len);
char *makestrspace(size_t, char *);
char *stnputs(const char *, size_t, char *);
char *stputs(const char *, char *);
diff --git a/usr/dash/parser.c...
2020 Mar 28
0
[klibc:update-dash] dash: exec: Do not allocate stack string in padvance
...int hashcmd(int, char **);
void find_command(char *, struct cmdentry *, int, const char *);
struct builtincmd *find_builtin(const char *);
diff --git a/usr/dash/mail.c b/usr/dash/mail.c
index 02e07f77..7f9e49de 100644
--- a/usr/dash/mail.c
+++ b/usr/dash/mail.c
@@ -77,9 +77,12 @@ chkmail(void)
setstackmark(&smark);
mpath = mpathset() ? mpathval() : mailval();
for (mtp = mailtime; mtp < mailtime + MAXMBOXES; mtp++) {
- p = padvance(&mpath, nullstr);
- if (p == NULL)
+ int len;
+
+ len = padvance(&mpath, nullstr);
+ if (!len)
break;
+ p = stackblock();
if (*p == '\0&...
2020 Mar 28
0
[klibc:update-dash] dash: eval: Replace with listsetvar with mklocal/setvareq
...execcmd;
int status;
char **nargv;
+ int vflags;
+ int vlocal;
errlinno = lineno = cmd->ncmd.linno;
if (funcline)
@@ -745,7 +747,6 @@ evalcommand(union node *cmd, int flags)
/* First expand the arguments. */
TRACE(("evalcommand(0x%lx, %d) called\n", (long)cmd, flags));
setstackmark(&smark);
- localvar_stop = pushlocalvars();
file_stop = parsefile;
back_exitstatus = 0;
@@ -759,6 +760,8 @@ evalcommand(union node *cmd, int flags)
cmd_flag = 0;
execcmd = 0;
spclbltin = -1;
+ vflags = 0;
+ vlocal = 0;
path = NULL;
argc = 0;
@@ -770,6 +773,8 @@ evalcommand(uni...
2007 Aug 23
0
[git patch] klibc dash 0.5.4 update
...evalstring(p, ~SKIPEVAL);
-
+ return evalstring(p, ~SKIPEVAL);
}
- return exitstatus;
+ return 0;
}
@@ -166,24 +165,23 @@ evalstring(char *s, int mask)
{
union node *n;
struct stackmark smark;
- int skip;
+ int status;
setinputstring(s);
setstackmark(&smark);
- skip = 0;
+ status = 0;
while ((n = parsecmd(0)) != NEOF) {
evaltree(n, 0);
+ status = exitstatus;
popstackmark(&smark);
- skip = evalskip;
- if (skip)
+ if (evalskip)
break;
}
popfile();
- skip &= mask;
- evalskip = skip;
- return skip;
+ evalskip &am...