mirror of
https://gitlab.alpinelinux.org/alpine/aports.git
synced 2025-08-05 13:27:09 +02:00
134 lines
3.4 KiB
Diff
134 lines
3.4 KiB
Diff
From 687398b9df5a8fc2d17bd9d83e067812980ec853 Mon Sep 17 00:00:00 2001
|
|
From: Tycho Andersen <tycho@docker.com>
|
|
Date: Tue, 14 Mar 2017 13:57:35 -0700
|
|
Subject: [PATCH] libsemanage: remove use of getpwent_r
|
|
|
|
getpwent_r isn't really re-entrant, and the _r version is a GNU extension,
|
|
which won't work with libcs that don't implement it. Let's just use
|
|
getpwent instead.
|
|
|
|
Signed-off-by: Tycho Andersen <tycho@docker.com>
|
|
---
|
|
src/genhomedircon.c | 54 ++++++++++++++++++-----------------------
|
|
1 file changed, 24 insertions(+), 30 deletions(-)
|
|
|
|
diff --git a/src/genhomedircon.c b/libsemanage/src/genhomedircon.c
|
|
index 465dd88..839280b 100644
|
|
--- a/src/genhomedircon.c
|
|
+++ b/src/genhomedircon.c
|
|
@@ -290,14 +290,11 @@ static semanage_list_t *get_home_dirs(genhomedircon_settings_t * s)
|
|
semanage_list_t *homedir_list = NULL;
|
|
semanage_list_t *shells = NULL;
|
|
fc_match_handle_t hand;
|
|
- char *rbuf = NULL;
|
|
char *path = NULL;
|
|
- long rbuflen;
|
|
uid_t temp, minuid = 500, maxuid = 60000;
|
|
int minuid_set = 0;
|
|
- struct passwd pwstorage, *pwbuf;
|
|
+ struct passwd *pwbuf;
|
|
struct stat buf;
|
|
- int retval;
|
|
|
|
path = semanage_findval(PATH_ETC_USERADD, "HOME", "=");
|
|
if (path && *path) {
|
|
@@ -362,14 +359,18 @@ static semanage_list_t *get_home_dirs(genhomedircon_settings_t * s)
|
|
free(path);
|
|
path = NULL;
|
|
|
|
- rbuflen = sysconf(_SC_GETPW_R_SIZE_MAX);
|
|
- if (rbuflen <= 0)
|
|
- goto fail;
|
|
- rbuf = malloc(rbuflen);
|
|
- if (rbuf == NULL)
|
|
- goto fail;
|
|
setpwent();
|
|
- while ((retval = getpwent_r(&pwstorage, rbuf, rbuflen, &pwbuf)) == 0) {
|
|
+ while (1) {
|
|
+ errno = 0;
|
|
+ pwbuf = getpwent();
|
|
+ if (!pwbuf) {
|
|
+ if (errno) {
|
|
+ WARN(s->h_semanage, "Error while fetching users. "
|
|
+ "Returning list so far.");
|
|
+ }
|
|
+ break;
|
|
+ }
|
|
+
|
|
if (pwbuf->pw_uid < minuid || pwbuf->pw_uid > maxuid)
|
|
continue;
|
|
if (!semanage_list_find(shells, pwbuf->pw_shell))
|
|
@@ -413,23 +414,16 @@ static semanage_list_t *get_home_dirs(genhomedircon_settings_t * s)
|
|
path = NULL;
|
|
}
|
|
|
|
- if (retval && retval != ENOENT) {
|
|
- 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);
|
|
|
|
return homedir_list;
|
|
|
|
fail:
|
|
endpwent();
|
|
- free(rbuf);
|
|
free(path);
|
|
semanage_list_destroy(&homedir_list);
|
|
semanage_list_destroy(&shells);
|
|
@@ -1063,9 +1057,7 @@ static int get_group_users(genhomedircon_settings_t * s,
|
|
char *grbuf = NULL;
|
|
struct group grstorage, *group = NULL;
|
|
|
|
- long prbuflen;
|
|
- char *pwbuf = NULL;
|
|
- struct passwd pwstorage, *pw = NULL;
|
|
+ struct passwd *pw = NULL;
|
|
|
|
grbuflen = sysconf(_SC_GETGR_R_SIZE_MAX);
|
|
if (grbuflen <= 0)
|
|
@@ -1102,15 +1094,18 @@ static int get_group_users(genhomedircon_settings_t * s,
|
|
}
|
|
}
|
|
|
|
- prbuflen = sysconf(_SC_GETPW_R_SIZE_MAX);
|
|
- if (prbuflen <= 0)
|
|
- goto cleanup;
|
|
- pwbuf = malloc(prbuflen);
|
|
- if (pwbuf == NULL)
|
|
- goto cleanup;
|
|
-
|
|
setpwent();
|
|
- while ((retval = getpwent_r(&pwstorage, pwbuf, prbuflen, &pw)) == 0) {
|
|
+ while (1) {
|
|
+ errno = 0;
|
|
+ pw = getpwent();
|
|
+ if (!pw) {
|
|
+ if (errno) {
|
|
+ WARN(s->h_semanage, "Error while fetching groups. "
|
|
+ "Returning list so far.");
|
|
+ }
|
|
+ break;
|
|
+ }
|
|
+
|
|
// skip users who also have this group as their
|
|
// primary group
|
|
if (lfind(pw->pw_name, group->gr_mem, &nmembers,
|
|
@@ -1129,7 +1124,6 @@ static int get_group_users(genhomedircon_settings_t * s,
|
|
retval = STATUS_SUCCESS;
|
|
cleanup:
|
|
endpwent();
|
|
- free(pwbuf);
|
|
free(grbuf);
|
|
|
|
return retval;
|
|
--
|
|
2.9.3
|
|
|