From: Piotr JaroszyƄski Date: Wed, 14 Jul 2010 20:25:55 +0000 (+0200) Subject: [settings] Unregister the children when unregistering the parent X-Git-Tag: v1.20.1~2599 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=519a4be18951cd8cc2f5a63392ee3611a6cbea82;p=thirdparty%2Fipxe.git [settings] Unregister the children when unregistering the parent The DHCP settings registered as a child of the netdevice settings are not unregistered anywhere. This prevents the netdevice from being freed on shutdown. Fix by automatically unregistering any child settings when the parent settings are unregistered. Modified-by: Michael Brown Signed-off-by: Michael Brown --- diff --git a/src/core/settings.c b/src/core/settings.c index 427b9ed6c..79fb8e72a 100644 --- a/src/core/settings.c +++ b/src/core/settings.c @@ -459,15 +459,22 @@ int register_settings ( struct settings *settings, struct settings *parent ) { * @v settings Settings block */ void unregister_settings ( struct settings *settings ) { + struct settings *child; + struct settings *tmp; + + /* Unregister child settings */ + list_for_each_entry_safe ( child, tmp, &settings->children, siblings ) { + unregister_settings ( child ); + } DBGC ( settings, "Settings %p (\"%s\") unregistered\n", settings, settings_name ( settings ) ); /* Remove from list of settings */ - ref_put ( settings->refcnt ); ref_put ( settings->parent->refcnt ); settings->parent = NULL; list_del ( &settings->siblings ); + ref_put ( settings->refcnt ); /* Apply potentially-updated settings */ apply_settings();