summaryrefslogtreecommitdiff
path: root/init.c
diff options
context:
space:
mode:
authorEric Andersen2001-03-15 19:18:21 +0000
committerEric Andersen2001-03-15 19:18:21 +0000
commit0d4e51d390b7118a4f2332834964e49de9469426 (patch)
treea81a8d6be9667bc43b83331d600a39647c44bc53 /init.c
parent0b57e28373550f7657bd4e026ae482806139885f (diff)
downloadbusybox-0d4e51d390b7118a4f2332834964e49de9469426.zip
busybox-0d4e51d390b7118a4f2332834964e49de9469426.tar.gz
Prevent init from potentially using already freed memory when
deleting an initAction, fixing a bug pointed out by Andreas Neuhaus -Erik
Diffstat (limited to 'init.c')
-rw-r--r--init.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/init.c b/init.c
index 53e9744..eb1b2c5 100644
--- 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 */