Module Name: src
Committed By: christos
Date: Fri Sep 8 15:29:44 UTC 2017
Modified Files:
src/crypto/external/bsd/heimdal/dist: configure.ac
src/crypto/external/bsd/heimdal/dist/kcm: client.c config.c
src/crypto/external/bsd/heimdal/dist/lib/hx509: softp11.c
src/crypto/external/bsd/heimdal/dist/lib/krb5: config_file.c
get_default_principal.c
src/crypto/external/bsd/heimdal/dist/lib/roken: getxxyyy.c roken.h.in
src/crypto/external/bsd/heimdal/include: config.h roken.h
Added Files:
src/crypto/external/bsd/heimdal/dist/cf: check-getpwuid_r-posix.m4
Log Message:
Use getpwuid_r instead of getpwuid, so that we don't trash getpw*() internal
buffers.
kde does (kdm/client/backend.c):
p = getpwnam();
pam_setcred() (which calls getpwuid in pam_afslog);
setusercontext(...,p,p->pw_uid,...) (now with trashed p data...)
XXX: pullups.
To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/crypto/external/bsd/heimdal/dist/configure.ac
cvs rdiff -u -r0 -r1.1 \
src/crypto/external/bsd/heimdal/dist/cf/check-getpwuid_r-posix.m4
cvs rdiff -u -r1.2 -r1.3 src/crypto/external/bsd/heimdal/dist/kcm/client.c \
src/crypto/external/bsd/heimdal/dist/kcm/config.c
cvs rdiff -u -r1.2 -r1.3 \
src/crypto/external/bsd/heimdal/dist/lib/hx509/softp11.c
cvs rdiff -u -r1.2 -r1.3 \
src/crypto/external/bsd/heimdal/dist/lib/krb5/config_file.c \
src/crypto/external/bsd/heimdal/dist/lib/krb5/get_default_principal.c
cvs rdiff -u -r1.2 -r1.3 \
src/crypto/external/bsd/heimdal/dist/lib/roken/getxxyyy.c
cvs rdiff -u -r1.4 -r1.5 \
src/crypto/external/bsd/heimdal/dist/lib/roken/roken.h.in
cvs rdiff -u -r1.8 -r1.9 src/crypto/external/bsd/heimdal/include/config.h
cvs rdiff -u -r1.7 -r1.8 src/crypto/external/bsd/heimdal/include/roken.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/crypto/external/bsd/heimdal/dist/configure.ac
diff -u src/crypto/external/bsd/heimdal/dist/configure.ac:1.2 src/crypto/external/bsd/heimdal/dist/configure.ac:1.3
--- src/crypto/external/bsd/heimdal/dist/configure.ac:1.2 Sat Jan 28 16:31:43 2017
+++ src/crypto/external/bsd/heimdal/dist/configure.ac Fri Sep 8 11:29:43 2017
@@ -1,5 +1,5 @@
dnl Process this file with autoconf to produce a configure script.
-AC_REVISION($Revision: 1.2 $)
+AC_REVISION($Revision: 1.3 $)
AC_PREREQ(2.62)
test -z "$CFLAGS" && CFLAGS="-g"
AC_INIT([Heimdal],[7.99.1],[https://github.com/heimdal/heimdal/issues])
@@ -514,6 +514,7 @@ KRB_CAPABILITIES
rk_DLADDR
AC_CHECK_GETPWNAM_R_POSIX
+AC_CHECK_GETPWUID_R_POSIX
dnl detect doors on solaris
if test "$enable_pthread_support" != no; then
Index: src/crypto/external/bsd/heimdal/dist/kcm/client.c
diff -u src/crypto/external/bsd/heimdal/dist/kcm/client.c:1.2 src/crypto/external/bsd/heimdal/dist/kcm/client.c:1.3
--- src/crypto/external/bsd/heimdal/dist/kcm/client.c:1.2 Sat Jan 28 16:31:44 2017
+++ src/crypto/external/bsd/heimdal/dist/kcm/client.c Fri Sep 8 11:29:43 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: client.c,v 1.2 2017/01/28 21:31:44 christos Exp $ */
+/* $NetBSD: client.c,v 1.3 2017/09/08 15:29:43 christos Exp $ */
/*
* Copyright (c) 2005, PADL Software Pty Ltd.
@@ -174,8 +174,10 @@ kcm_ccache_new_client(krb5_context conte
if (matches == 0)
matches = sscanf(name,"%ld",&uid);
if (matches == 1) {
- struct passwd *pwd = getpwuid(uid);
- if (pwd != NULL) {
+ struct passwd pw, *pwd = NULL;
+ char pwbuf[2048];
+
+ if (rk_getpwuid_r(getuid(), &pw, pwbuf, sizeof(pwbuf), &pwd) == 0) {
gid_t gid = pwd->pw_gid;
kcm_chown(context, client, ccache, uid, gid);
}
Index: src/crypto/external/bsd/heimdal/dist/kcm/config.c
diff -u src/crypto/external/bsd/heimdal/dist/kcm/config.c:1.2 src/crypto/external/bsd/heimdal/dist/kcm/config.c:1.3
--- src/crypto/external/bsd/heimdal/dist/kcm/config.c:1.2 Sat Jan 28 16:31:44 2017
+++ src/crypto/external/bsd/heimdal/dist/kcm/config.c Fri Sep 8 11:29:43 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: config.c,v 1.2 2017/01/28 21:31:44 christos Exp $ */
+/* $NetBSD: config.c,v 1.3 2017/09/08 15:29:43 christos Exp $ */
/*
* Copyright (c) 2005, PADL Software Pty Ltd.
@@ -159,28 +159,33 @@ static int parse_owners(kcm_ccache ccach
{
uid_t uid = 0;
gid_t gid = 0;
- struct passwd *pw;
struct group *gr;
int uid_p = 0;
int gid_p = 0;
+ struct passwd pw, *pwd = NULL;
+ char pwbuf[2048];
if (system_user != NULL) {
if (isdigit((unsigned char)system_user[0])) {
- pw = getpwuid(atoi(system_user));
+ if (rk_getpwuid_r(atoi(system_user), &pw, pwbuf, sizeof(pwbuf),
+ &pwd) != 0)
+ pwd = NULL;
} else {
- pw = getpwnam(system_user);
+ if (rk_getpwnam_r(system_user, &pw, pwbuf, sizeof(pwbuf),
+ &pwd) != 0)
+ pwd = NULL;
}
- if (pw == NULL) {
+ if (pwd == NULL) {
return errno;
}
- system_user = strdup(pw->pw_name);
+ system_user = strdup(pwd->pw_name);
if (system_user == NULL) {
return ENOMEM;
}
- uid = pw->pw_uid; uid_p = 1;
- gid = pw->pw_gid; gid_p = 1;
+ uid = pwd->pw_uid; uid_p = 1;
+ gid = pwd->pw_gid; gid_p = 1;
}
if (system_group != NULL) {
Index: src/crypto/external/bsd/heimdal/dist/lib/hx509/softp11.c
diff -u src/crypto/external/bsd/heimdal/dist/lib/hx509/softp11.c:1.2 src/crypto/external/bsd/heimdal/dist/lib/hx509/softp11.c:1.3
--- src/crypto/external/bsd/heimdal/dist/lib/hx509/softp11.c:1.2 Sat Jan 28 16:31:48 2017
+++ src/crypto/external/bsd/heimdal/dist/lib/hx509/softp11.c Fri Sep 8 11:29:43 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: softp11.c,v 1.2 2017/01/28 21:31:48 christos Exp $ */
+/* $NetBSD: softp11.c,v 1.3 2017/09/08 15:29:43 christos Exp $ */
/*
* Copyright (c) 2004 - 2008 Kungliga Tekniska Högskolan
@@ -833,9 +833,11 @@ get_config_file_for_user(void)
home = getenv("HOME");
}
if (fn == NULL && home == NULL) {
- struct passwd *pw = getpwuid(getuid());
- if(pw != NULL)
- home = pw->pw_dir;
+ struct passwd pw, *pwd = NULL;
+ char pwbuf[2048];
+
+ if (rk_getpwuid_r(getuid(), &pw, pwbuf, sizeof(pwbuf), &pwd) == 0)
+ home = pwd->pw_dir;
}
if (fn == NULL) {
if (home) {
Index: src/crypto/external/bsd/heimdal/dist/lib/krb5/config_file.c
diff -u src/crypto/external/bsd/heimdal/dist/lib/krb5/config_file.c:1.2 src/crypto/external/bsd/heimdal/dist/lib/krb5/config_file.c:1.3
--- src/crypto/external/bsd/heimdal/dist/lib/krb5/config_file.c:1.2 Sat Jan 28 16:31:49 2017
+++ src/crypto/external/bsd/heimdal/dist/lib/krb5/config_file.c Fri Sep 8 11:29:43 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: config_file.c,v 1.2 2017/01/28 21:31:49 christos Exp $ */
+/* $NetBSD: config_file.c,v 1.3 2017/09/08 15:29:43 christos Exp $ */
/*
* Copyright (c) 1997 - 2004 Kungliga Tekniska Högskolan
@@ -441,9 +441,11 @@ krb5_config_parse_file_multi (krb5_conte
home = getenv("HOME");
if (home == NULL) {
- struct passwd *pw = getpwuid(getuid());
- if(pw != NULL)
- home = pw->pw_dir;
+ struct passwd pw, *pwd = NULL;
+ char pwbuf[2048];
+
+ if (rk_getpwuid_r(getuid(), &pw, pwbuf, sizeof(pwbuf), &pwd) == 0)
+ home = pwd->pw_dir;
}
if (home) {
int aret;
Index: src/crypto/external/bsd/heimdal/dist/lib/krb5/get_default_principal.c
diff -u src/crypto/external/bsd/heimdal/dist/lib/krb5/get_default_principal.c:1.2 src/crypto/external/bsd/heimdal/dist/lib/krb5/get_default_principal.c:1.3
--- src/crypto/external/bsd/heimdal/dist/lib/krb5/get_default_principal.c:1.2 Sat Jan 28 16:31:49 2017
+++ src/crypto/external/bsd/heimdal/dist/lib/krb5/get_default_principal.c Fri Sep 8 11:29:43 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: get_default_principal.c,v 1.2 2017/01/28 21:31:49 christos Exp $ */
+/* $NetBSD: get_default_principal.c,v 1.3 2017/09/08 15:29:43 christos Exp $ */
/*
* Copyright (c) 1997 - 2001 Kungliga Tekniska Högskolan
@@ -78,9 +78,11 @@ _krb5_get_default_principal_local (krb5_
else
ret = krb5_make_principal(context, princ, NULL, "root", NULL);
} else {
- struct passwd *pw = getpwuid(uid);
- if(pw != NULL)
- user = pw->pw_name;
+ struct passwd pw, *pwd = NULL;
+ char pwbuf[2048];
+
+ if (rk_getpwuid_r(uid, &pw, pwbuf, sizeof(pwbuf), &pwd) == 0)
+ user = pwd->pw_name;
else {
user = get_env_user();
if(user == NULL)
Index: src/crypto/external/bsd/heimdal/dist/lib/roken/getxxyyy.c
diff -u src/crypto/external/bsd/heimdal/dist/lib/roken/getxxyyy.c:1.2 src/crypto/external/bsd/heimdal/dist/lib/roken/getxxyyy.c:1.3
--- src/crypto/external/bsd/heimdal/dist/lib/roken/getxxyyy.c:1.2 Sat Jan 28 16:31:50 2017
+++ src/crypto/external/bsd/heimdal/dist/lib/roken/getxxyyy.c Fri Sep 8 11:29:43 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: getxxyyy.c,v 1.2 2017/01/28 21:31:50 christos Exp $ */
+/* $NetBSD: getxxyyy.c,v 1.3 2017/09/08 15:29:43 christos Exp $ */
/*
* Copyright (c) 2011 Kungliga Tekniska Högskolan
@@ -39,30 +39,18 @@
#ifdef TEST_GETXXYYY
#undef rk_getpwnam_r
+#undef rk_getpwuid_r
ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
rk_getpwnam_r(const char *, struct passwd *, char *, size_t, struct passwd **);
+ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
+rk_getpwuid_r(uid_t, struct passwd *, char *, size_t, struct passwd **);
#endif
-#if !defined(POSIX_GETPWNAM_R) || defined(TEST_GETXXYYY)
-
-/*
- * At least limit the race between threads
- */
-
-ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
-rk_getpwnam_r(const char *name, struct passwd *pwd, char *buffer,
- size_t bufsize, struct passwd **result)
+#if !defined(POSIX_GETPWUID_R) || !defined(POSIX_GETPWNAM_R) || defined(TEST_GETXXYYY)
+static void
+copypw(struct passwd *pwd, char *buffer, size_t bufsize, const struct passwd *p)
{
- struct passwd *p;
- size_t slen, n = 0;
-
- *result = NULL;
-
- p = getpwnam(name);
- if(p == NULL)
- return (errno = ENOENT);
-
memset(pwd, 0, sizeof(*pwd));
#define APPEND(el) \
@@ -83,6 +71,53 @@ do { \
APPEND(pw_gecos);
APPEND(pw_dir);
APPEND(pw_shell);
+}
+
+#if !defined(POSIX_GETPWUID_R) || defined(TEST_GETXXYYY)
+/*
+ * At least limit the race between threads
+ */
+
+ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
+rk_getpwnam_r(const char *name, struct passwd *pwd, char *buffer,
+ size_t bufsize, struct passwd **result)
+{
+ struct passwd *p;
+ size_t slen, n = 0;
+
+ *result = NULL;
+
+ p = getpwnam(name);
+ if(p == NULL)
+ return (errno = ENOENT);
+
+ copypw(pwd, buffer, bufsize, p);
+
+ *result = pwd;
+
+ return 0;
+}
+
+#if !defined(POSIX_GETPWNAM_R) || defined(TEST_GETXXYYY)
+
+/*
+ * At least limit the race between threads
+ */
+
+ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
+rk_getpwnam_r(const char *name, struct passwd *pwd, char *buffer,
+ size_t bufsize, struct passwd **result)
+{
+ struct passwd *p;
+ size_t slen, n = 0;
+
+ *result = NULL;
+
+ p = getpwnam(name);
+ if(p == NULL)
+ return (errno = ENOENT);
+
+ copypw(pwd, buffer, bufsize, p);
*result = pwd;
@@ -133,6 +168,18 @@ main(int argc, char **argv)
if (ret == 0)
errx(1, "rk_getpwnam_r no user");
+ ret = rk_getpwuid_r(0, &pwd, buf, sizeof(buf), &result);
+ if (ret)
+ errx(1, "rk_getpwuid_r");
+ print_result(result);
+
+ ret = rk_getpwuid_r(0, &pwd, buf, 1, &result);
+ if (ret == 0)
+ errx(1, "rk_getpwuid_r too small buf");
+
+ ret = rk_getpwuid_r(-1234, &pwd, buf, sizeof(buf), &result);
+ if (ret == 0)
+ errx(1, "rk_getpwuid_r no user");
return 0;
}
Index: src/crypto/external/bsd/heimdal/dist/lib/roken/roken.h.in
diff -u src/crypto/external/bsd/heimdal/dist/lib/roken/roken.h.in:1.4 src/crypto/external/bsd/heimdal/dist/lib/roken/roken.h.in:1.5
--- src/crypto/external/bsd/heimdal/dist/lib/roken/roken.h.in:1.4 Sat Jan 28 16:31:50 2017
+++ src/crypto/external/bsd/heimdal/dist/lib/roken/roken.h.in Fri Sep 8 11:29:43 2017
@@ -650,6 +650,13 @@ ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
rk_getpwnam_r(const char *, struct passwd *, char *, size_t, struct passwd **);
#endif
+#ifdef POSIX_GETPWUID_R
+#define rk_getpwuid_r(_u, _pw, _b, _sz, _pwd) getpwuid_r(_u, _pw, _b, _sz, _pwd)
+#else
+ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
+rk_getpwuid_r(uid_t, struct passwd *, char *, size_t, struct passwd **);
+#endif
+
ROKEN_LIB_FUNCTION const char * ROKEN_LIB_CALL get_default_username (void);
#ifndef HAVE_SETEUID
Index: src/crypto/external/bsd/heimdal/include/config.h
diff -u src/crypto/external/bsd/heimdal/include/config.h:1.8 src/crypto/external/bsd/heimdal/include/config.h:1.9
--- src/crypto/external/bsd/heimdal/include/config.h:1.8 Sat Jan 28 20:46:16 2017
+++ src/crypto/external/bsd/heimdal/include/config.h Fri Sep 8 11:29:44 2017
@@ -471,6 +471,9 @@ static /**/const char *const rcsid[] = {
/* Define to 1 if you have the `getpwnam_r' function. */
#define HAVE_GETPWNAM_R 1
+/* Define to 1 if you have the `getpwuid_r' function. */
+#define HAVE_GETPWUID_R 1
+
/* Define to 1 if you have the `getrlimit' function. */
#define HAVE_GETRLIMIT 1
@@ -1470,6 +1473,9 @@ static /**/const char *const rcsid[] = {
/* Define if getpwnam_r has POSIX flavour. */
#define POSIX_GETPWNAM_R 1
+/* Define if getpwuid_r has POSIX flavour. */
+#define POSIX_GETPWUID_R 1
+
/* Define if you have the readline package. */
/* #undef READLINE */
Index: src/crypto/external/bsd/heimdal/include/roken.h
diff -u src/crypto/external/bsd/heimdal/include/roken.h:1.7 src/crypto/external/bsd/heimdal/include/roken.h:1.8
--- src/crypto/external/bsd/heimdal/include/roken.h:1.7 Sun Jan 29 14:38:38 2017
+++ src/crypto/external/bsd/heimdal/include/roken.h Fri Sep 8 11:29:44 2017
@@ -159,6 +159,7 @@ ROKEN_LIB_FUNCTION struct passwd * ROKEN
ROKEN_LIB_FUNCTION struct passwd * ROKEN_LIB_CALL k_getpwuid (uid_t);
#define rk_getpwnam_r(_n, _pw, _b, _sz, _pwd) getpwnam_r(_n, _pw, _b, _sz, _pwd)
+#define rk_getpwuid_r(_u, _pw, _b, _sz, _pwd) getpwuid_r(_u, _pw, _b, _sz, _pwd)
ROKEN_LIB_FUNCTION const char * ROKEN_LIB_CALL get_default_username (void);
Added files:
Index: src/crypto/external/bsd/heimdal/dist/cf/check-getpwuid_r-posix.m4
diff -u /dev/null src/crypto/external/bsd/heimdal/dist/cf/check-getpwuid_r-posix.m4:1.1
--- /dev/null Fri Sep 8 11:29:44 2017
+++ src/crypto/external/bsd/heimdal/dist/cf/check-getpwuid_r-posix.m4 Fri Sep 8 11:29:43 2017
@@ -0,0 +1,40 @@
+dnl Id
+dnl
+dnl check for getpwuid_r, and if it's posix or not
+
+AC_DEFUN([AC_CHECK_GETPWUID_R_POSIX],[
+AC_FIND_FUNC_NO_LIBS(getpwuid_r,c_r)
+if test "$ac_cv_func_getpwuid_r" = yes; then
+ AC_CACHE_CHECK(if getpwuid_r is posix,ac_cv_func_getpwuid_r_posix,
+ ac_libs="$LIBS"
+ LIBS="$LIBS $LIB_getpwuid_r"
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#define _POSIX_PTHREAD_SEMANTICS
+#include <pwd.h>
+int main(int argc, char **argv)
+{
+ struct passwd pw, *pwd;
+ return getpwuid_r(0, &pw, 0, 0, &pwd) < 0;
+}
+]])],[ac_cv_func_getpwuid_r_posix=yes],[ac_cv_func_getpwuid_r_posix=no],[:])
+LIBS="$ac_libs")
+ AC_CACHE_CHECK(if _POSIX_PTHREAD_SEMANTICS is needed,ac_cv_func_getpwuid_r_posix_def,
+ ac_libs="$LIBS"
+ LIBS="$LIBS $LIB_getpwuid_r"
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <pwd.h>
+int main(int argc, char **argv)
+{
+ struct passwd pw, *pwd;
+ return getpwuid_r(0, &pw, 0, 0, &pwd) < 0;
+}
+]])],[ac_cv_func_getpwuid_r_posix_def=no],[ac_cv_func_getpwuid_r_posix_def=yes],[:])
+LIBS="$ac_libs")
+if test "$ac_cv_func_getpwuid_r_posix" = yes; then
+ AC_DEFINE(POSIX_GETPWUID_R, 1, [Define if getpwuid_r has POSIX flavour.])
+fi
+if test "$ac_cv_func_getpwuid_r_posix" = yes -a "$ac_cv_func_getpwuid_r_posix_def" = yes; then
+ AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Define to get POSIX getpwuid_r in some systems.])
+fi
+fi
+])