[PATCH 1/1] (GNU/Hurd) Add new PAM patch.
---
debian/libpam-modules-bin.install | 3 -
debian/patches/hurd-fix.patch | 276 ++++++++++++++++++++++++++++++
debian/patches/hurd_no_setfsuid | 84 ---------
debian/patches/series | 3 +-
4 files changed, 277 insertions(+), 89 deletions(-)
create mode 100644 debian/patches/hurd-fix.patch
delete mode 100644 debian/patches/hurd_no_setfsuid
diff --git a/debian/libpam-modules-bin.install b/debian/libpam-modules-bin.install
index 3c70ef6f..2e6001b8 100644
--- a/debian/libpam-modules-bin.install
+++ b/debian/libpam-modules-bin.install
@@ -1,8 +1,5 @@
usr/sbin/unix_chkpwd
-usr/sbin/unix_update
usr/sbin/mkhomedir_helper
-usr/sbin/pam_namespace_helper
usr/sbin/pwhistory_helper
usr/sbin/pam_timestamp_check
usr/sbin/faillock
-usr/lib/systemd/system/pam_namespace.service
diff --git a/debian/patches/hurd-fix.patch b/debian/patches/hurd-fix.patch
new file mode 100644
index 00000000..bab0717c
--- /dev/null
+++ b/debian/patches/hurd-fix.patch
@@ -0,0 +1,276 @@
+diff --git a/examples/tty_conv.c b/examples/tty_conv.c
+index 59bbb3b3..0a7af97c 100644
+--- a/examples/tty_conv.c
++++ b/examples/tty_conv.c
+@@ -8,7 +8,6 @@
+ #include <unistd.h>
+ #include <termios.h>
+ #include <security/pam_appl.h>
+-#include <sys/ioctl.h>
+
+ /***************************************
+ * @brief echo off/on
+@@ -18,7 +17,7 @@
+ static void echoOff(int fd, int off)
+ {
+ struct termios tty;
+- if (ioctl(fd, TCGETA, &tty) < 0)
++ if (tcgetattr(fd, &tty) < 0)
+ {
+ fprintf(stderr, "TCGETA failed: %s\n", strerror(errno));
+ return;
+@@ -27,7 +26,7 @@ static void echoOff(int fd, int off)
+ if (off)
+ {
+ tty.c_lflag &= ~(ECHO | ECHOE | ECHOK | ECHONL);
+- if (ioctl(fd, TCSETAF, &tty) < 0)
++ if (tcsetattr(fd, TCSAFLUSH, &tty) < 0)
+ {
+ fprintf(stderr, "TCSETAF failed: %s\n", strerror(errno));
+ }
+@@ -35,7 +34,7 @@ static void echoOff(int fd, int off)
+ else
+ {
+ tty.c_lflag |= (ECHO | ECHOE | ECHOK | ECHONL);
+- if (ioctl(fd, TCSETAW, &tty) < 0)
++ if (tcsetattr(fd, TCSADRAIN, &tty) < 0)
+ {
+ fprintf(stderr, "TCSETAW failed: %s\n", strerror(errno));
+ }
+diff --git a/libpam/include/pam_hurd_max_stub.h b/libpam/include/pam_hurd_max_stub.h
+new file mode 100644
+index 00000000..c3c9b510
+--- /dev/null
++++ b/libpam/include/pam_hurd_max_stub.h
+@@ -0,0 +1,11 @@
++#ifndef PAM_HURD_MAX_STUB_H
++#define PAM_HURD_MAX_STUB_H
++
++/*
++ * Define PATH_MAX if not available
++ */
++#ifndef PATH_MAX
++#define PATH_MAX 4096
++#endif
++
++#endif
+diff --git a/libpam/pam_modutil_priv.c b/libpam/pam_modutil_priv.c
+index a463e06a..7df6e6b1 100644
+--- a/libpam/pam_modutil_priv.c
++++ b/libpam/pam_modutil_priv.c
+@@ -14,7 +14,9 @@
+ #include <syslog.h>
+ #include <pwd.h>
+ #include <grp.h>
++#ifdef HAVE_SYS_FSUID_H
+ #include <sys/fsuid.h>
++#endif /* HAVE_SYS_FSUID_H */
+
+ /*
+ * Two setfsuid() calls in a row are necessary to check
+@@ -22,17 +24,55 @@
+ */
+ static int change_uid(uid_t uid, uid_t *save)
+ {
++#ifdef HAVE_SYS_FSUID_H
+ uid_t tmp = setfsuid(uid);
+ if (save)
+ *save = tmp;
+ return (uid_t) setfsuid(uid) == uid ? 0 : -1;
++#else
++ uid_t euid = geteuid();
++ uid_t ruid = getuid();
++ if (save)
++ *save = ruid;
++ if (ruid == uid && uid != 0)
++ if (setreuid(euid, uid))
++ return -1;
++ else {
++ setreuid(0, -1);
++ if (setreuid(-1, uid)) {
++ setreuid(-1, 0);
++ setreuid(0, -1);
++ if (setreuid(-1, uid))
++ return -1;
++ }
++ }
++#endif
+ }
+ static int change_gid(gid_t gid, gid_t *save)
+ {
++#ifdef HAVE_SYS_FSUID_H
+ gid_t tmp = setfsgid(gid);
+ if (save)
+ *save = tmp;
+ return (gid_t) setfsgid(gid) == gid ? 0 : -1;
++#else
++ gid_t egid = getegid();
++ gid_t rgid = getgid();
++ if (save)
++ *save = rgid;
++ if (rgid == gid)
++ if (setregid(egid, gid))
++ return -1;
++ else {
++ setregid(0, -1);
++ if (setregid(-1, gid)) {
++ setregid(-1, 0);
++ setregid(0, -1);
++ if (setregid(-1, gid))
++ return -1;
++ }
++ }
++#endif
+ }
+
+ static int cleanup(struct pam_modutil_privs *p)
+diff --git a/modules/pam_debug/tst-pam_debug-retval.c b/modules/pam_debug/tst-pam_debug-retval.c
+index e83c89d5..ae5772a3 100644
+--- a/modules/pam_debug/tst-pam_debug-retval.c
++++ b/modules/pam_debug/tst-pam_debug-retval.c
+@@ -11,6 +11,7 @@
+ #include <string.h>
+ #include <unistd.h>
+ #include <security/pam_appl.h>
++#include <pam_hurd_max_stub.h>
+
+ #define MODULE_NAME "pam_debug"
+ #define TEST_NAME "tst-" MODULE_NAME "-retval"
+diff --git a/modules/pam_deny/tst-pam_deny-retval.c b/modules/pam_deny/tst-pam_deny-retval.c
+index 665fcef4..3fa29591 100644
+--- a/modules/pam_deny/tst-pam_deny-retval.c
++++ b/modules/pam_deny/tst-pam_deny-retval.c
+@@ -11,6 +11,7 @@
+ #include <string.h>
+ #include <unistd.h>
+ #include <security/pam_appl.h>
++#include <pam_hurd_max_stub.h>
+
+ #define MODULE_NAME "pam_deny"
+ #define TEST_NAME "tst-" MODULE_NAME "-retval"
+diff --git a/modules/pam_echo/tst-pam_echo-retval.c b/modules/pam_echo/tst-pam_echo-retval.c
+index 8264cb0e..acceffd0 100644
+--- a/modules/pam_echo/tst-pam_echo-retval.c
++++ b/modules/pam_echo/tst-pam_echo-retval.c
+@@ -11,6 +11,7 @@
+ #include <string.h>
+ #include <unistd.h>
+ #include <security/pam_appl.h>
++#include <pam_hurd_max_stub.h>
+
+ #define MODULE_NAME "pam_echo"
+ #define TEST_NAME "tst-" MODULE_NAME "-retval"
+diff --git a/modules/pam_faildelay/tst-pam_faildelay-retval.c b/modules/pam_faildelay/tst-pam_faildelay-retval.c
+index 72b16ef9..a73876ad 100644
+--- a/modules/pam_faildelay/tst-pam_faildelay-retval.c
++++ b/modules/pam_faildelay/tst-pam_faildelay-retval.c
+@@ -11,6 +11,7 @@
+ #include <string.h>
+ #include <unistd.h>
+ #include <security/pam_appl.h>
++#include <pam_hurd_max_stub.h>
+
+ #define MODULE_NAME "pam_faildelay"
+ #define TEST_NAME "tst-" MODULE_NAME "-retval"
+diff --git a/modules/pam_localuser/tst-pam_localuser-retval.c b/modules/pam_localuser/tst-pam_localuser-retval.c
+index f6c22f97..1f576ab4 100644
+--- a/modules/pam_localuser/tst-pam_localuser-retval.c
++++ b/modules/pam_localuser/tst-pam_localuser-retval.c
+@@ -12,6 +12,7 @@
+ #include <string.h>
+ #include <unistd.h>
+ #include <security/pam_appl.h>
++#include <pam_hurd_max_stub.h>
+
+ #define MODULE_NAME "pam_localuser"
+ #define TEST_NAME "tst-" MODULE_NAME "-retval"
+diff --git a/modules/pam_mkhomedir/tst-pam_mkhomedir-retval.c b/modules/pam_mkhomedir/tst-pam_mkhomedir-retval.c
+index 282c5cd0..ada30f9b 100644
+--- a/modules/pam_mkhomedir/tst-pam_mkhomedir-retval.c
++++ b/modules/pam_mkhomedir/tst-pam_mkhomedir-retval.c
+@@ -14,6 +14,7 @@
+ #include <pwd.h>
+ #include <sys/stat.h>
+ #include <security/pam_appl.h>
++#include <pam_hurd_max_stub.h>
+
+ #define MODULE_NAME "pam_mkhomedir"
+ #define TEST_NAME "tst-" MODULE_NAME "-retval"
+diff --git a/modules/pam_nologin/tst-pam_nologin-retval.c b/modules/pam_nologin/tst-pam_nologin-retval.c
+index 4d44a380..47e3f2d1 100644
+--- a/modules/pam_nologin/tst-pam_nologin-retval.c
++++ b/modules/pam_nologin/tst-pam_nologin-retval.c
+@@ -12,6 +12,7 @@
+ #include <unistd.h>
+ #include <pwd.h>
+ #include <security/pam_appl.h>
++#include <pam_hurd_max_stub.h>
+
+ #define MODULE_NAME "pam_nologin"
+ #define TEST_NAME "tst-" MODULE_NAME "-retval"
+diff --git a/modules/pam_permit/tst-pam_permit-retval.c b/modules/pam_permit/tst-pam_permit-retval.c
+index aacdedba..a129bb82 100644
+--- a/modules/pam_permit/tst-pam_permit-retval.c
++++ b/modules/pam_permit/tst-pam_permit-retval.c
+@@ -11,6 +11,7 @@
+ #include <string.h>
+ #include <unistd.h>
+ #include <security/pam_appl.h>
++#include <pam_hurd_max_stub.h>
+
+ #define MODULE_NAME "pam_permit"
+ #define TEST_NAME "tst-" MODULE_NAME "-retval"
+diff --git a/modules/pam_rootok/tst-pam_rootok-retval.c b/modules/pam_rootok/tst-pam_rootok-retval.c
+index 990ee126..bb05a195 100644
+--- a/modules/pam_rootok/tst-pam_rootok-retval.c
++++ b/modules/pam_rootok/tst-pam_rootok-retval.c
+@@ -11,6 +11,7 @@
+ #include <string.h>
+ #include <unistd.h>
+ #include <security/pam_appl.h>
++#include <pam_hurd_max_stub.h>
+
+ #define MODULE_NAME "pam_rootok"
+ #define TEST_NAME "tst-" MODULE_NAME "-retval"
+diff --git a/modules/pam_warn/tst-pam_warn-retval.c b/modules/pam_warn/tst-pam_warn-retval.c
+index 48b1f311..83bf2aad 100644
+--- a/modules/pam_warn/tst-pam_warn-retval.c
++++ b/modules/pam_warn/tst-pam_warn-retval.c
+@@ -11,6 +11,7 @@
+ #include <string.h>
+ #include <unistd.h>
+ #include <security/pam_appl.h>
++#include <pam_hurd_max_stub.h>
+
+ #define MODULE_NAME "pam_warn"
+ #define TEST_NAME "tst-" MODULE_NAME "-retval"
+diff --git a/modules/pam_xauth/pam_xauth.c b/modules/pam_xauth/pam_xauth.c
+index 5e80b312..6c70b3f7 100644
+--- a/modules/pam_xauth/pam_xauth.c
++++ b/modules/pam_xauth/pam_xauth.c
+@@ -67,6 +67,10 @@
+ #include "pam_cc_compat.h"
+ #include "pam_inline.h"
+
++#ifndef HOST_NAME_MAX
++#define HOST_NAME_MAX 255
++#endif
++
+ #define DATANAME "pam_xauth_cookie_file"
+ #define XAUTHENV "XAUTHORITY"
+ #define HOMEENV "HOME"
+diff --git a/tests/tst-dlopen.c b/tests/tst-dlopen.c
+index cba3e9a8..118091ad 100644
+--- a/tests/tst-dlopen.c
++++ b/tests/tst-dlopen.c
+@@ -14,9 +14,7 @@
+ #include <limits.h>
+ #include <sys/stat.h>
+
+-#ifndef PATH_MAX
+-# define PATH_MAX 4096
+-#endif
++#include <pam_hurd_max_stub.h>
+
+ /* Simple program to see if dlopen() would succeed. */
+ int main(int argc, char **argv)
diff --git a/debian/patches/hurd_no_setfsuid b/debian/patches/hurd_no_setfsuid
deleted file mode 100644
index 16d8ba54..00000000
--- a/debian/patches/hurd_no_setfsuid
+++ /dev/null
@@ -1,84 +0,0 @@
-From: Sam Hartman <hartmans@debian.org>
-Date: Mon, 11 Sep 2023 14:00:42 -0600
-Subject: hurd_no_setfsuid
-
-On systems without setfsuid(), use setreuid() instead.
-
-Authors: Steve Langasek <vorlon@debian.org>
-
-Upstream status: to be forwarded, now that pam_modutil_{drop,regain}_priv
- are implemented
----
- libpam/pam_modutil_priv.c | 40 ++++++++++++++++++++++++++++++++++++++++
- 1 file changed, 40 insertions(+)
-
-diff --git a/libpam/pam_modutil_priv.c b/libpam/pam_modutil_priv.c
-index a463e06..7df6e6b 100644
---- a/libpam/pam_modutil_priv.c
-+++ b/libpam/pam_modutil_priv.c
-@@ -14,7 +14,9 @@
- #include <syslog.h>
- #include <pwd.h>
- #include <grp.h>
-+#ifdef HAVE_SYS_FSUID_H
- #include <sys/fsuid.h>
-+#endif /* HAVE_SYS_FSUID_H */
-
- /*
- * Two setfsuid() calls in a row are necessary to check
-@@ -22,17 +24,55 @@
- */
- static int change_uid(uid_t uid, uid_t *save)
- {
-+#ifdef HAVE_SYS_FSUID_H
- uid_t tmp = setfsuid(uid);
- if (save)
- *save = tmp;
- return (uid_t) setfsuid(uid) == uid ? 0 : -1;
-+#else
-+ uid_t euid = geteuid();
-+ uid_t ruid = getuid();
-+ if (save)
-+ *save = ruid;
-+ if (ruid == uid && uid != 0)
-+ if (setreuid(euid, uid))
-+ return -1;
-+ else {
-+ setreuid(0, -1);
-+ if (setreuid(-1, uid)) {
-+ setreuid(-1, 0);
-+ setreuid(0, -1);
-+ if (setreuid(-1, uid))
-+ return -1;
-+ }
-+ }
-+#endif
- }
- static int change_gid(gid_t gid, gid_t *save)
- {
-+#ifdef HAVE_SYS_FSUID_H
- gid_t tmp = setfsgid(gid);
- if (save)
- *save = tmp;
- return (gid_t) setfsgid(gid) == gid ? 0 : -1;
-+#else
-+ gid_t egid = getegid();
-+ gid_t rgid = getgid();
-+ if (save)
-+ *save = rgid;
-+ if (rgid == gid)
-+ if (setregid(egid, gid))
-+ return -1;
-+ else {
-+ setregid(0, -1);
-+ if (setregid(-1, gid)) {
-+ setregid(-1, 0);
-+ setregid(0, -1);
-+ if (setregid(-1, gid))
-+ return -1;
-+ }
-+ }
-+#endif
- }
-
- static int cleanup(struct pam_modutil_privs *p)
diff --git a/debian/patches/series b/debian/patches/series
index 1745a718..bc06b462 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -10,11 +10,10 @@ pam-limits-nofile-fd-setsize-cap
008_modules_pam_limits_chroot
040_pam_limits_log_failure
045_pam_dispatch_jump_is_ignore
-# Broken after meson.build ; see #1095194
-# hurd_no_setfsuid
PAM-manpage-section
update-motd
lib_security_multiarch_compat
nullok_secure-compat.patch
pam_mkhomedir_stat_before_opendir
0018-Libpam-is-both-shared-and-static.patch
+hurd-fix.patch
--
Yuqian Yang <crupest@crupest.life>
Reply to: