procd: shift arguments for askfirst only once
authorMichael Heimpold <mhei@heimpold.de>
Tue, 1 Jan 2019 23:44:56 +0000 (00:44 +0100)
committerJohn Crispin <john@phrozen.org>
Sun, 27 Oct 2019 13:21:14 +0000 (14:21 +0100)
In case we want to process an inittab item multiple times (e.g. in case
of hotplugging) we must not shift the arguments for askfirst multiple
times. So check whether we already did it.

Signed-off-by: Michael Heimpold <mhei@heimpold.de>
inittab.c

index b67730c4a5b0a1ae3bba7736f0be4f43c01c3c30..1cfef2ba78c69f5e26fe4cce66585f9520e314e4 100644 (file)
--- a/inittab.c
+++ b/inittab.c
@@ -165,9 +165,12 @@ static void askfirst(struct init_action *a)
        }
 
        a->tout.cb = respawn;
-       for (i = MAX_ARGS - 1; i >= 1; i--)
-               a->argv[i] = a->argv[i - 1];
-       a->argv[0] = ask;
+       /* shift arguments only if not yet done */
+       if (a->argv[0] != ask) {
+               for (i = MAX_ARGS - 1; i >= 1; i--)
+                       a->argv[i] = a->argv[i - 1];
+               a->argv[0] = ask;
+       }
        a->respawn = 500;
 
        a->proc.cb = child_exit;
@@ -200,9 +203,12 @@ static void askconsole(struct init_action *a)
        }
 
        a->tout.cb = respawn;
-       for (i = MAX_ARGS - 1; i >= 1; i--)
-               a->argv[i] = a->argv[i - 1];
-       a->argv[0] = ask;
+       /* shift arguments only if not yet done */
+       if (a->argv[0] != ask) {
+               for (i = MAX_ARGS - 1; i >= 1; i--)
+                       a->argv[i] = a->argv[i - 1];
+               a->argv[0] = ask;
+       }
        a->respawn = 500;
 
        a->proc.cb = child_exit;