summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--shell/ash.c29
1 files changed, 12 insertions, 17 deletions
diff --git a/shell/ash.c b/shell/ash.c
index e0ddf71..6505f49 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -1740,6 +1740,15 @@ growstackstr(void)
return (char *)stackblock() + len;
}
+static char *
+growstackto(size_t len)
+{
+ while (stackblocksize() < len)
+ growstackblock();
+
+ return stackblock();
+}
+
/*
* Called from CHECKSTRSPACE.
*/
@@ -1747,18 +1756,8 @@ static char *
makestrspace(size_t newlen, char *p)
{
size_t len = p - g_stacknxt;
- size_t size;
-
- for (;;) {
- size_t nleft;
- size = stackblocksize();
- nleft = size - len;
- if (nleft >= newlen)
- break;
- growstackblock();
- }
- return (char *)stackblock() + len;
+ return growstackto(len + newlen) + len;
}
static char *
@@ -2584,9 +2583,7 @@ path_advance(const char **path, const char *name)
for (p = start; *p && *p != ':' && *p != '%'; p++)
continue;
len = p - start + strlen(name) + 2; /* "2" is for '/' and '\0' */
- while (stackblocksize() < len)
- growstackblock();
- q = stackblock();
+ q = growstackto(len);
if (p != start) {
q = mempcpy(q, start, p - start);
*q++ = '/';
@@ -12836,9 +12833,7 @@ parsebackq: {
/* Ignore any pushed back tokens left from the backquote parsing. */
if (oldstyle)
tokpushback = 0;
- while (stackblocksize() <= savelen)
- growstackblock();
- STARTSTACKSTR(out);
+ out = growstackto(savelen + 1);
if (str) {
memcpy(out, str, savelen);
STADJUST(savelen, out);