From abbf0a33c7f75a5948b729ebd5438a3c63d5106a Mon Sep 17 00:00:00 2001 From: Leah Neukirchen Date: Mon, 23 Sep 2019 13:25:04 +0200 Subject: [PATCH] util-linux: fix chsh on musl. --- srcpkgs/util-linux/patches/chsh.patch | 89 +++++++++++++++++++++++++++ srcpkgs/util-linux/template | 2 +- 2 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 srcpkgs/util-linux/patches/chsh.patch diff --git a/srcpkgs/util-linux/patches/chsh.patch b/srcpkgs/util-linux/patches/chsh.patch new file mode 100644 index 00000000000..d2cbd0d8ddf --- /dev/null +++ b/srcpkgs/util-linux/patches/chsh.patch @@ -0,0 +1,89 @@ +Patch by Quentin Rameau : +use getpwuid_r since chsh uses readline (which does tilde expansion) +can overwrite the getpwuid buffer on musl in the meantime. + +https://inbox.vuxu.org/voidlinux/20190922131237.93849-1-quinq@fifth.space/ +https://lore.kernel.org/util-linux/20190921185021.10568-1-quinq@fifth.space/ + +--- include/pwdutils.h ++++ include/pwdutils.h +@@ -5,6 +5,7 @@ + #include + + extern struct passwd *xgetpwnam(const char *username, char **pwdbuf); ++extern struct passwd *xgetpwuid(uid_t uid, char **pwdbuf); + extern char *xgetlogin(void); + + #endif /* UTIL_LINUX_PWDUTILS_H */ +--- lib/pwdutils.c ++++ lib/pwdutils.c +@@ -36,6 +36,34 @@ failed: + return NULL; + } + ++struct passwd *xgetpwuid(uid_t uid, char **pwdbuf) ++{ ++ struct passwd *pwd = NULL, *res = NULL; ++ int rc; ++ ++ if (!pwdbuf) ++ return NULL; ++ ++ *pwdbuf = xmalloc(UL_GETPW_BUFSIZ); ++ pwd = xcalloc(1, sizeof(struct passwd)); ++ ++ errno = 0; ++ rc = getpwuid_r(uid, pwd, *pwdbuf, UL_GETPW_BUFSIZ, &res); ++ if (rc != 0) { ++ errno = rc; ++ goto failed; ++ } ++ if (!res) { ++ errno = EINVAL; ++ goto failed; ++ } ++ return pwd; ++failed: ++ free(pwd); ++ free(*pwdbuf); ++ return NULL; ++} ++ + char *xgetlogin(void) + { + struct passwd *pw = NULL; +--- login-utils/chsh.c ++++ login-utils/chsh.c +@@ -38,6 +38,7 @@ + #include "islocal.h" + #include "nls.h" + #include "pathnames.h" ++#include "pwdutils.h" + #include "setpwnam.h" + #include "strutils.h" + #include "xalloc.h" +@@ -253,7 +254,7 @@ static void check_shell(const char *shell) + + int main(int argc, char **argv) + { +- char *oldshell; ++ char *oldshell, *pwbuf; + int nullshell = 0; + const uid_t uid = getuid(); + struct sinfo info = { NULL }; +@@ -267,12 +268,12 @@ int main(int argc, char **argv) + + parse_argv(argc, argv, &info); + if (!info.username) { +- pw = getpwuid(uid); ++ pw = xgetpwuid(uid, &pwbuf); + if (!pw) + errx(EXIT_FAILURE, _("you (user %d) don't exist."), + uid); + } else { +- pw = getpwnam(info.username); ++ pw = xgetpwnam(info.username, &pwbuf); + if (!pw) + errx(EXIT_FAILURE, _("user \"%s\" does not exist."), + info.username); + diff --git a/srcpkgs/util-linux/template b/srcpkgs/util-linux/template index 8a06c8f1e3c..9f912097d85 100644 --- a/srcpkgs/util-linux/template +++ b/srcpkgs/util-linux/template @@ -1,7 +1,7 @@ # Template file for 'util-linux' pkgname=util-linux version=2.34 -revision=1 +revision=2 hostmakedepends="automake bison gettext-devel libtool pkg-config" makedepends="libcap-ng-devel pam-devel readline-devel zlib-devel" checkdepends="ncurses" # Some tests require terminfo-entries