summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Nordberg <linus@nordberg.se>2015-01-16 16:33:29 +0100
committerLinus Nordberg <linus@nordberg.se>2015-01-16 16:33:29 +0100
commit0c7f02c751405864266b78f0e358bbc28609e3ba (patch)
tree956148095813456d2ea8ce30b53f0bab029ae342
parent0a1fa90d723d085bc869bc423619e1a8ee421fd0 (diff)
Fix use-after-free in _internal_removeserversubrealms().
Patch by Stephen Röttger.
-rw-r--r--radsecproxy.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/radsecproxy.c b/radsecproxy.c
index a074ec2..505afd0 100644
--- a/radsecproxy.c
+++ b/radsecproxy.c
@@ -777,6 +777,7 @@ int hasdynamicserver(struct list *srvconfs) {
void _internal_removeserversubrealms(struct list *realmlist, struct clsrvconf *srv) {
struct list_node *entry, *entry2;
struct realm *realm;
+ struct list *srvconfs;
for (entry = list_first(realmlist); entry;) {
realm = newrealmref((struct realm *)entry->data);
@@ -784,16 +785,18 @@ void _internal_removeserversubrealms(struct list *realmlist, struct clsrvconf *s
entry = list_next(entry);
if (realm->srvconfs) {
+ srvconfs = realm->srvconfs;
for (entry2 = list_first(realm->srvconfs); entry2; entry2 = list_next(entry2))
if (entry2->data == srv)
freerealm(realm);
- list_removedata(realm->srvconfs, srv);
+ list_removedata(srvconfs, srv);
}
if (realm->accsrvconfs) {
+ srvconfs = realm->accsrvconfs;
for (entry2 = list_first(realm->accsrvconfs); entry2; entry2 = list_next(entry2))
if (entry2->data == srv)
freerealm(realm);
- list_removedata(realm->accsrvconfs, srv);
+ list_removedata(srvconfs, srv);
}
/* remove subrealm if no dynamic servers left */