Prevent init from potentially using already freed memory when
deleting an initAction, fixing a bug pointed out by Andreas Neuhaus
-Erik
diff --git a/init.c b/init.c
index 53e9744..eb1b2c5 100644
--- a/init.c
+++ b/init.c
@@ -598,8 +598,8 @@
/* 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 @@
extern int init_main(int argc, char **argv)
{
- initAction *a;
+ initAction *a, *tmp;
pid_t wpid;
int status;
@@ -938,7 +938,7 @@
/* 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 @@
}
}
/* 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 @@
}
}
/* 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 */
diff --git a/init/init.c b/init/init.c
index 53e9744..eb1b2c5 100644
--- a/init/init.c
+++ b/init/init.c
@@ -598,8 +598,8 @@
/* 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 @@
extern int init_main(int argc, char **argv)
{
- initAction *a;
+ initAction *a, *tmp;
pid_t wpid;
int status;
@@ -938,7 +938,7 @@
/* 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 @@
}
}
/* 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 @@
}
}
/* 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 */