summaryrefslogtreecommitdiffstats
path: root/discover/user-event.c
diff options
context:
space:
mode:
authorSamuel Mendoza-Jonas <sam@mendozajonas.com>2016-09-01 14:32:03 +1000
committerSamuel Mendoza-Jonas <sam@mendozajonas.com>2016-09-02 14:27:29 +1000
commitc8c61f78d0583acedcde0ba69b57936bf27337ca (patch)
treeea577a0745cf6373d98db5efdff65830eb632a24 /discover/user-event.c
parent5496eee36f70631ae45403f90ed7b4dc143f27c0 (diff)
downloadtalos-petitboot-1.2.4.tar.gz
talos-petitboot-1.2.4.zip
discover/event: Ensure event struct exists for async callersv1.2.4
When handling an event, user_event_handle_message() creates an event struct with relevant parameters. Once user_event_handle_message() is finished it frees the struct. However in the case of a dhcp or add_url event, asynchronous jobs may be spawned that will later reference the event struct. In particular this becomes a problem when pxe_process_pair() handles an IPAPPEND name/value pair and tries to access event->device. In the case of dhcp and add_url events, we avoid this by changing the event struct's talloc parent to the discover_context struct which persists until all async pxe jobs have completed. Signed-off-by: Samuel Mendoza-Jonas <sam@mendozajonas.com> (cherry picked from commit a50d5fe279db71cf85fabeb675c99b167ec63dcb)
Diffstat (limited to 'discover/user-event.c')
-rw-r--r--discover/user-event.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/discover/user-event.c b/discover/user-event.c
index 7350b6c..d9f5bd4 100644
--- a/discover/user-event.c
+++ b/discover/user-event.c
@@ -503,13 +503,13 @@ static void user_event_handle_message(struct user_event *uev, char *buf,
break;
case EVENT_ACTION_URL:
result = user_event_url(uev, event);
- break;
+ goto out;
case EVENT_ACTION_CONF:
result = user_event_conf(uev, event);
break;
case EVENT_ACTION_DHCP:
result = user_event_dhcp(uev, event);
- break;
+ goto out;
case EVENT_ACTION_BOOT:
result = user_event_boot(uev, event);
break;
@@ -520,8 +520,10 @@ static void user_event_handle_message(struct user_event *uev, char *buf,
break;
}
+ /* user_event_url() and user_event_dhcp() will steal the event context,
+ * but all others still need to free */
talloc_free(event);
-
+out:
return;
}
OpenPOWER on IntegriCloud