Prevent init from potentially using already freed memory when
authorEric Andersen <andersen@codepoet.org>
Thu, 15 Mar 2001 19:18:21 +0000 (19:18 -0000)
committerEric Andersen <andersen@codepoet.org>
Thu, 15 Mar 2001 19:18:21 +0000 (19:18 -0000)
deleting an initAction, fixing a bug pointed out by Andreas Neuhaus
 -Erik

init.c
init/init.c

diff --git a/init.c b/init.c
index 53e9744..eb1b2c5 100644 (file)
--- a/init.c
+++ b/init.c
@@ -598,8 +598,8 @@ static void check_memory()
 /* Run all commands to be run right before halt/reboot */
 static void run_lastAction(void)
 {
-       initAction *a;
-       for (a = initActionList; a; a = a->nextPtr) {
+       initAction *a, *tmp;
+       for (a = tmp = initActionList; a; a = tmp = tmp->nextPtr) {
                if (a->action == CTRLALTDEL) {
                        waitfor(a->process, a->console, FALSE);
                        delete_initAction(a);
@@ -843,7 +843,7 @@ static void parse_inittab(void)
 
 extern int init_main(int argc, char **argv)
 {
-       initAction *a;
+       initAction *a, *tmp;
        pid_t wpid;
        int status;
 
@@ -938,7 +938,7 @@ extern int init_main(int argc, char **argv)
        /* Now run everything that needs to be run */
 
        /* First run the sysinit command */
-       for (a = initActionList; a; a = a->nextPtr) {
+       for (a = tmp = initActionList; a; a = tmp = tmp->nextPtr) {
                if (a->action == SYSINIT) {
                        waitfor(a->process, a->console, FALSE);
                        /* Now remove the "sysinit" entry from the list */
@@ -946,7 +946,7 @@ extern int init_main(int argc, char **argv)
                }
        }
        /* Next run anything that wants to block */
-       for (a = initActionList; a; a = a->nextPtr) {
+       for (a = tmp = initActionList; a; a = tmp = tmp->nextPtr) {
                if (a->action == WAIT) {
                        waitfor(a->process, a->console, FALSE);
                        /* Now remove the "wait" entry from the list */
@@ -954,7 +954,7 @@ extern int init_main(int argc, char **argv)
                }
        }
        /* Next run anything to be run only once */
-       for (a = initActionList; a; a = a->nextPtr) {
+       for (a = tmp = initActionList; a; a = tmp = tmp->nextPtr) {
                if (a->action == ONCE) {
                        run(a->process, a->console, FALSE);
                        /* Now remove the "once" entry from the list */
index 53e9744..eb1b2c5 100644 (file)
@@ -598,8 +598,8 @@ static void check_memory()
 /* Run all commands to be run right before halt/reboot */
 static void run_lastAction(void)
 {
-       initAction *a;
-       for (a = initActionList; a; a = a->nextPtr) {
+       initAction *a, *tmp;
+       for (a = tmp = initActionList; a; a = tmp = tmp->nextPtr) {
                if (a->action == CTRLALTDEL) {
                        waitfor(a->process, a->console, FALSE);
                        delete_initAction(a);
@@ -843,7 +843,7 @@ static void parse_inittab(void)
 
 extern int init_main(int argc, char **argv)
 {
-       initAction *a;
+       initAction *a, *tmp;
        pid_t wpid;
        int status;
 
@@ -938,7 +938,7 @@ extern int init_main(int argc, char **argv)
        /* Now run everything that needs to be run */
 
        /* First run the sysinit command */
-       for (a = initActionList; a; a = a->nextPtr) {
+       for (a = tmp = initActionList; a; a = tmp = tmp->nextPtr) {
                if (a->action == SYSINIT) {
                        waitfor(a->process, a->console, FALSE);
                        /* Now remove the "sysinit" entry from the list */
@@ -946,7 +946,7 @@ extern int init_main(int argc, char **argv)
                }
        }
        /* Next run anything that wants to block */
-       for (a = initActionList; a; a = a->nextPtr) {
+       for (a = tmp = initActionList; a; a = tmp = tmp->nextPtr) {
                if (a->action == WAIT) {
                        waitfor(a->process, a->console, FALSE);
                        /* Now remove the "wait" entry from the list */
@@ -954,7 +954,7 @@ extern int init_main(int argc, char **argv)
                }
        }
        /* Next run anything to be run only once */
-       for (a = initActionList; a; a = a->nextPtr) {
+       for (a = tmp = initActionList; a; a = tmp = tmp->nextPtr) {
                if (a->action == ONCE) {
                        run(a->process, a->console, FALSE);
                        /* Now remove the "once" entry from the list */