summaryrefslogtreecommitdiff
path: root/debian/patches/make-zsh-static-really-static-#993843.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches/make-zsh-static-really-static-#993843.patch')
-rw-r--r--debian/patches/make-zsh-static-really-static-#993843.patch168
1 files changed, 168 insertions, 0 deletions
diff --git a/debian/patches/make-zsh-static-really-static-#993843.patch b/debian/patches/make-zsh-static-really-static-#993843.patch
new file mode 100644
index 000000000..60b7b8bc9
--- /dev/null
+++ b/debian/patches/make-zsh-static-really-static-#993843.patch
@@ -0,0 +1,168 @@
+Description: Fix dynamic linking with zsh-static and resulting segfaults on libc updates
+Origin: https://zsh.org/workers/49422
+Bug-Debian: https://bugs.debian.org/993843
+Bug: https://zsh.org/workers/49392
+Author: Axel Beckert <abe@debian.org>
+Author: Jun T <takimoto-j@kba.biglobe.ne.jp>
+
+--- a/Src/Modules/parameter.c
++++ b/Src/Modules/parameter.c
+@@ -2011,6 +2011,9 @@
+ /**/
+ static Groupset get_all_groups(void)
+ {
++#ifdef DISABLE_DYNAMIC_NSS
++ return NULL;
++#else
+ Groupset gs = zhalloc(sizeof(*gs));
+ Groupmap gaptr;
+ gid_t *list, *lptr, egid;
+@@ -2063,6 +2066,7 @@
+ }
+
+ return gs;
++#endif /* DISABLE_DYNAMIC_NSS */
+ }
+
+ /* Standard hash element lookup. */
+@@ -2081,7 +2085,11 @@
+ pm->gsu.s = &nullsetscalar_gsu;
+
+ if (!gs) {
++#ifdef DISABLE_DYNAMIC_NSS
++ zerr("parameter 'usergroups' not available: NSS is disabled");
++#else
+ zerr("failed to retrieve groups for user: %e", errno);
++#endif
+ pm->u.str = dupstring("");
+ pm->node.flags |= (PM_UNSET|PM_SPECIAL);
+ return &pm->node;
+@@ -2113,7 +2121,11 @@
+ Groupmap gaptr;
+
+ if (!gs) {
++#ifdef DISABLE_DYNAMIC_NSS
++ zerr("parameter 'usergroups' not available: NSS is disabled");
++#else
+ zerr("failed to retrieve groups for user: %e", errno);
++#endif
+ return;
+ }
+
+--- a/Src/hashnameddir.c
++++ b/Src/hashnameddir.c
+@@ -178,7 +178,7 @@
+ /* Using NIS or NIS+ didn't add any user directories. This seems
+ * fishy, so we fall back to using getpwent(). If we don't have
+ * that, we only use the passwd file. */
+-#ifdef HAVE_GETPWENT
++#ifdef USE_GETPWENT
+ struct passwd *pw;
+
+ setpwent();
+@@ -190,7 +190,7 @@
+
+ endpwent();
+ usepwf = 0;
+-#endif /* HAVE_GETPWENT */
++#endif /* USE_GETPWENT */
+ }
+ if (usepwf) {
+ /* Don't forget the non-NIS matches from the flat passwd file */
+@@ -229,7 +229,7 @@
+ adduserdir(pw->pw_name, pw->pw_dir, ND_USERNAME, 1);
+
+ endpwent();
+-#endif /* HAVE_GETPWENT */
++#endif /* USE_GETPWENT */
+ #endif
+ allusersadded = 1;
+ }
+--- a/Src/options.c
++++ b/Src/options.c
+@@ -807,7 +807,7 @@
+ return -1;
+ }
+
+-# ifdef HAVE_INITGROUPS
++# ifdef USE_INITGROUPS
+ /* Set the supplementary groups list.
+ *
+ * Note that on macOS, FreeBSD, and possibly some other platforms,
+--- a/Src/params.c
++++ b/Src/params.c
+@@ -841,9 +841,12 @@
+ setsparam("HOST", ztrdup_metafy(hostnam));
+ zfree(hostnam, 256);
+
+- setsparam("LOGNAME",
+- ztrdup_metafy((str = getlogin()) && *str ?
+- str : cached_username));
++ setsparam("LOGNAME", ztrdup_metafy(
++#ifndef DISABLE_DYNAMIC_NSS
++ (str = getlogin()) && *str ? str :
++#endif
++ cached_username
++ ));
+
+ #if !defined(HAVE_PUTENV) && !defined(USE_SET_UNSET_ENV)
+ /* Copy the environment variables we are inheriting to dynamic *
+@@ -4414,7 +4417,7 @@
+ void
+ usernamesetfn(UNUSED(Param pm), char *x)
+ {
+-#if defined(HAVE_SETUID) && defined(HAVE_GETPWNAM)
++#if defined(HAVE_SETUID) && defined(USE_GETPWNAM)
+ struct passwd *pswd;
+
+ if (x && (pswd = getpwnam(x)) && (pswd->pw_uid != cached_uid)) {
+@@ -4431,7 +4434,7 @@
+ cached_uid = pswd->pw_uid;
+ }
+ }
+-#endif /* HAVE_SETUID && HAVE_GETPWNAM */
++#endif /* HAVE_SETUID && USE_GETPWNAM */
+ zsfree(x);
+ }
+
+--- a/Src/utils.c
++++ b/Src/utils.c
+@@ -1115,7 +1115,7 @@
+ char *
+ get_username(void)
+ {
+-#ifdef HAVE_GETPWUID
++#ifdef USE_GETPWUID
+ struct passwd *pswd;
+ uid_t current_uid;
+
+@@ -1128,9 +1128,9 @@
+ else
+ cached_username = ztrdup("");
+ }
+-#else /* !HAVE_GETPWUID */
++#else /* !USE_GETPWUID */
+ cached_uid = getuid();
+-#endif /* !HAVE_GETPWUID */
++#endif /* !USE_GETPWUID */
+ return cached_username;
+ }
+
+@@ -1306,7 +1306,7 @@
+ return str;
+ }
+
+-#ifdef HAVE_GETPWNAM
++#ifdef USE_GETPWNAM
+ {
+ /* Retrieve an entry from the password table/database for this user. */
+ struct passwd *pw;
+@@ -1322,7 +1322,7 @@
+ return dupstring(pw->pw_dir);
+ }
+ }
+-#endif /* HAVE_GETPWNAM */
++#endif /* USE_GETPWNAM */
+
+ /* There are no more possible sources of directory names, so give up. */
+ return NULL;