diff --exclude-from=exclude -N -u -r nsalibsemanage/src/genhomedircon.c libsemanage-2.0.10/src/genhomedircon.c --- nsalibsemanage/src/genhomedircon.c 2007-09-28 09:48:57.000000000 -0400 +++ libsemanage-2.0.10/src/genhomedircon.c 2007-09-28 10:59:54.000000000 -0400 @@ -575,10 +575,8 @@ return STATUS_SUCCESS; } -static genhomedircon_user_entry_t *get_users(genhomedircon_settings_t * s, - int *errors) +static int setup_fallback_user(genhomedircon_settings_t * s) { - genhomedircon_user_entry_t *head = NULL; semanage_seuser_t **seuser_list = NULL; unsigned int nseusers = 0; semanage_user_t **user_list = NULL; @@ -587,17 +585,13 @@ const char *name = NULL; const char *seuname = NULL; const char *prefix = NULL; - struct passwd pwstorage, *pwent = NULL; unsigned int i; - long rbuflen; - char *rbuf = NULL; int retval; - - *errors = 0; + int errors = 0; retval = semanage_seuser_list(s->h_semanage, &seuser_list, &nseusers); if (retval < 0 || (nseusers < 1)) { /* if there are no users, this function can't do any other work */ - return NULL; + return errors; } if (semanage_user_list(s->h_semanage, &user_list, &nusers) < 0) { @@ -607,14 +601,6 @@ qsort(user_list, nusers, sizeof(semanage_user_t *), (int (*)(const void *, const void *))&user_sort_func); - /* Allocate space for the getpwnam_r buffer */ - rbuflen = sysconf(_SC_GETPW_R_SIZE_MAX); - if (rbuflen <= 0) - goto cleanup; - rbuf = malloc(rbuflen); - if (rbuf == NULL) - goto cleanup; - for (i = 0; i < nseusers; i++) { name = semanage_seuser_get_name(seuser_list[i]); if (strcmp(name, DEFAULT_LOGIN) == 0) { @@ -630,14 +616,54 @@ } else { prefix = name; } - if (set_fallback_user(s, seuname, prefix) != 0) { - *errors = STATUS_ERR; - goto cleanup; + errors = STATUS_ERR; } break; } } + return errors; +} + +static genhomedircon_user_entry_t *get_users(genhomedircon_settings_t * s, + int *errors) +{ + genhomedircon_user_entry_t *head = NULL; + semanage_seuser_t **seuser_list = NULL; + unsigned int nseusers = 0; + semanage_user_t **user_list = NULL; + unsigned int nusers = 0; + semanage_user_t **u = NULL; + const char *name = NULL; + const char *seuname = NULL; + const char *prefix = NULL; + struct passwd pwstorage, *pwent = NULL; + unsigned int i; + long rbuflen; + char *rbuf = NULL; + int retval; + + *errors = 0; + retval = semanage_seuser_list(s->h_semanage, &seuser_list, &nseusers); + if (retval < 0 || (nseusers < 1)) { + /* if there are no users, this function can't do any other work */ + return NULL; + } + + if (semanage_user_list(s->h_semanage, &user_list, &nusers) < 0) { + nusers = 0; + } + + qsort(user_list, nusers, sizeof(semanage_user_t *), + (int (*)(const void *, const void *))&user_sort_func); + + /* Allocate space for the getpwnam_r buffer */ + rbuflen = sysconf(_SC_GETPW_R_SIZE_MAX); + if (rbuflen <= 0) + goto cleanup; + rbuf = malloc(rbuflen); + if (rbuf == NULL) + goto cleanup; for (i = 0; i < nseusers; i++) { seuname = semanage_seuser_get_sename(seuser_list[i]); @@ -769,12 +795,10 @@ goto done; } - if (write_gen_home_dir_context(s, out, user_context_tpl, - homedir_context_tpl) != STATUS_SUCCESS) { + if (setup_fallback_user(s) != 0) { retval = STATUS_ERR; goto done; } - for (h = homedirs; h; h = h->next) { Ustr *temp = ustr_dup_cstr(h->data); @@ -811,6 +835,12 @@ goto done; } + if (write_gen_home_dir_context(s, out, user_context_tpl, + homedir_context_tpl) != STATUS_SUCCESS) { + retval = STATUS_ERR; + goto done; + } + done: /* Cleanup */ semanage_list_destroy(&homedirs);