summaryrefslogtreecommitdiffstats
path: root/discover/device-handler.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-01 14:59:05 +1000
commita50d5fe279db71cf85fabeb675c99b167ec63dcb (patch)
tree2f7058badc87b030053ecb63c7312c3894ccf02c /discover/device-handler.c
parentccb478ac2e5b1e24ebb6af4130fdd37e1b36babb (diff)
downloadtalos-petitboot-a50d5fe279db71cf85fabeb675c99b167ec63dcb.zip
talos-petitboot-a50d5fe279db71cf85fabeb675c99b167ec63dcb.tar.gz
discover/event: Ensure event struct exists for async callers
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>
Diffstat (limited to 'discover/device-handler.c')
-rw-r--r--discover/device-handler.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/discover/device-handler.c b/discover/device-handler.c
index f6b6d22..346cb02 100644
--- a/discover/device-handler.c
+++ b/discover/device-handler.c
@@ -900,6 +900,7 @@ int device_handler_dhcp(struct device_handler *handler,
/* create our context */
ctx = device_handler_discover_context_create(handler, dev);
+ talloc_steal(ctx, event);
ctx->event = event;
iterate_parsers(ctx);
@@ -1171,6 +1172,7 @@ void device_handler_process_url(struct device_handler *handler,
if (pb_url->scheme == pb_url_file)
dev->device->type = DEVICE_TYPE_ANY;
ctx = device_handler_discover_context_create(handler, dev);
+ talloc_steal(ctx, event);
ctx->event = event;
iterate_parsers(ctx);
OpenPOWER on IntegriCloud