libsemanage: genhomedircon: double free in get_home_dirs
Right before the call to semanage_list_sort() we do some cleanup.
Including endpwent(); free(rbuf); semanage_list_destroy(&shells); If
the call to the list sort fails we will go to fail: and will do those
cleanups a second time. Whoops. Do the list sort before the generic
cleanups so the failure code isn't run after the default cleanup.
Signed-off-by: Eric Paris <[email protected]>
diff --git a/libsemanage/src/genhomedircon.c b/libsemanage/src/genhomedircon.c
index 70756a9..5c2f07f 100644
--- a/libsemanage/src/genhomedircon.c
+++ b/libsemanage/src/genhomedircon.c
@@ -401,11 +401,13 @@
WARN(s->h_semanage, "Error while fetching users. "
"Returning list so far.");
}
+
+ if (semanage_list_sort(&homedir_list))
+ goto fail;
+
endpwent();
free(rbuf);
semanage_list_destroy(&shells);
- if (semanage_list_sort(&homedir_list))
- goto fail;
return homedir_list;