Skip to content

Commit c37669a

Browse files
committed
src/sss_client/common.c: Use getpwnam_r to avoid clobbering struct passwd
If something else uses PAM (like openrc, see OpenRC/openrc#984) and getpwnam, and calls something like pam_open_session, sssd's call to getpwnam in init_sssd_ids clobbers the cached value by the other program. Signed-off-by: Christopher Byrne <salah.coronya@gmail.com>
1 parent 64ee91f commit c37669a

File tree

1 file changed

+29
-5
lines changed

1 file changed

+29
-5
lines changed

src/sss_client/common.c

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -148,11 +148,35 @@ static void init_sssd_ids(void)
148148
/* 'libnss_sss' doesn't resolve SSSD_USER,
149149
* so no need to set '_SSS_LOOPS'
150150
*/
151-
struct passwd *pwd = getpwnam(SSSD_USER);
152-
if (pwd != NULL) {
153-
sss_sssd_uid = pwd->pw_uid;
154-
sss_sssd_gid = pwd->pw_gid;
155-
}
151+
struct passwd pwd, *result;
152+
ssize_t bufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
153+
char* buf;
154+
int r;
155+
156+
if(bufsize == -1)
157+
bufsize = 16384;
158+
159+
if(!(buf = malloc(bufsize)))
160+
return;
161+
162+
do {
163+
r = getpwnam_r(SSSD_USER, &pwd, buf, bufsize, &result);
164+
if(!result) {
165+
if(r == ERANGE) {
166+
char* newbuf = realloc(buf, bufsize += 4096);
167+
168+
if(!newbuf)
169+
break;
170+
buf = newbuf;
171+
continue;
172+
}
173+
} else {
174+
sss_sssd_uid = result->pw_uid;
175+
sss_sssd_gid = result->pw_gid;
176+
}
177+
} while(!result && r == ERANGE);
178+
179+
free(buf);
156180
}
157181
#endif
158182
#endif /* SSSD_NON_ROOT_USER */

0 commit comments

Comments
 (0)