From c55847fedbc3cbc10f2558c5449d8635f318ce49 Mon Sep 17 00:00:00 2001
From: Denys Vlasenko <vda.linux@googlemail.com>
Date: Mon, 17 Feb 2020 15:59:08 +0100
Subject: ash: memalloc: Add growstackto helper

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 | 29 ++++++++++++-----------------
 1 file changed, 12 insertions(+), 17 deletions(-)

diff --git a/shell/ash.c b/shell/ash.c
index e0ddf7198..6505f4984 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);
-- 
cgit v1.2.3-55-g6feb