summaryrefslogtreecommitdiffstats
path: root/src/core/settings.c
diff options
context:
space:
mode:
authorMichael Brown2015-03-03 01:29:42 +0100
committerMichael Brown2015-03-03 01:29:42 +0100
commit0af3d14a2379fd7775ef09b5f882682496f7cbe6 (patch)
treeda442a2ccefd1789597d71119124b4f5fc709ba9 /src/core/settings.c
parent[pci] Rewrite unrelicensable portions of pci.h (diff)
downloadipxe-0af3d14a2379fd7775ef09b5f882682496f7cbe6.tar.gz
ipxe-0af3d14a2379fd7775ef09b5f882682496f7cbe6.tar.xz
ipxe-0af3d14a2379fd7775ef09b5f882682496f7cbe6.zip
[settings] Use list_first_entry() when unregistering child settings
Unregistering a child settings block can have almost arbitrary effects, due to the call to apply_settings(). Avoid potentially dereferencing a stale pointer by using list_first_entry() rather than list_for_each_entry_safe() to iterate over the list of child settings. Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/core/settings.c')
-rw-r--r--src/core/settings.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/src/core/settings.c b/src/core/settings.c
index 5e16b27d..85d95e6e 100644
--- a/src/core/settings.c
+++ b/src/core/settings.c
@@ -499,10 +499,10 @@ int register_settings ( struct settings *settings, struct settings *parent,
*/
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 ) {
+ while ( ( child = list_first_entry ( &settings->children,
+ struct settings, siblings ) ) ) {
unregister_settings ( child );
}