ash: memalloc: Add growstackto helper
authorDenys Vlasenko <vda.linux@googlemail.com>
Mon, 17 Feb 2020 14:59:08 +0000 (15:59 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Mon, 17 Feb 2020 14:59:08 +0000 (15:59 +0100)
Upstream commit:

    Date: Sat, 19 May 2018 02:39:46 +0800
    memalloc: Add growstackto helper

    This patch adds the growstackto helper which repeatedly calls
    growstackblock until the requested size is reached.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
shell/ash.c

index e0ddf7198032aa91f86d172cb278e6647f42bba4..6505f49841bf4648a2c2ead3fa5003781c7e8b5f 100644 (file)
@@ -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);