---
 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 <hartm...@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 <vor...@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 <crup...@crupest.life>

Reply via email to