summaryrefslogtreecommitdiff
path: root/debian/patches/make-zsh-static-really-static-#993843.patch
blob: 1b58b3a1cc1d5fea71da00627bf966086f7e5649 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
Description: Try to fix dynamic linking with zsh-static and resulting segfaults on libc updates
Bug-Debian: https://bugs.debian.org/993843
Bug: https://zsh.org/workers/49392
Author: Axel Beckert <abe@debian.org>

--- 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
@@ -4414,7 +4414,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 +4431,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;
--- a/Src/Modules/stat.c
+++ b/Src/Modules/stat.c
@@ -137,13 +137,13 @@
 	    strcat(outbuf, " (");
     }
     if (flags & STF_STRING) {
-#ifdef HAVE_GETPWUID
+#ifdef USE_GETPWUID
 	struct passwd *pwd;
 	pwd = getpwuid(uid);
 	if (pwd)
 	    strcat(outbuf, pwd->pw_name);
 	else
-#endif /* !HAVE_GETPWUID */
+#endif /* !USE_GETPWUID */
 	{
 	    char *optr;
 	    for (optr = outbuf; *optr; optr++)
--- a/Src/Modules/parameter.c
+++ b/Src/Modules/parameter.c
@@ -2055,7 +2055,9 @@
 
     /* Get group names */
     for (gaptr = gs->array; gaptr < gs->array + gs->num; gaptr++) {
+#ifdef USE_GETGRGID
 	grptr = getgrgid(gaptr->gid);
+#endif /* USE_GETGRGID */
 	if (!grptr) {
 	    return NULL;
 	}
--- a/Src/Modules/files.c
+++ b/Src/Modules/files.c
@@ -734,6 +734,7 @@
 	struct passwd *pwd;
 	if(end)
 	    *end = 0;
+#ifdef USE_GETPWNAM
 	pwd = getpwnam(p);
 	if(pwd)
 	    chm.uid = pwd->pw_uid;
@@ -746,20 +747,35 @@
 		return 1;
 	    }
 	}
+#else /* !USE_GETPWNAM */
+	zwarnnam(nam, "%s: getpwnam not usable in static build", p);
+	free(uspec);
+	return 1;
+#endif /* !USE_GETPWNAM */
 	if(end) {
 	    p = end+1;
 	    if(!*p) {
+#ifdef USE_GETPWUID
 		if(!pwd && !(pwd = getpwuid(chm.uid))) {
 		    zwarnnam(nam, "%s: no such user", uspec);
 		    free(uspec);
 		    return 1;
 		}
+#else /* !USE_GETPWUID */
+                if(!pwd) {
+		    zwarnnam(nam, "%s: getpwuid not usable in static build",
+			     uspec);
+		    free(uspec);
+		    return 1;
+		}
+#endif /* !USE_GETPWUID */
 		chm.gid = pwd->pw_gid;
 	    } else if(p[0] == ':' && !p[1]) {
 		chm.gid = -1;
 	    } else {
 		struct group *grp;
 		dogroup:
+#ifdef USE_GETGRNAM
 		grp = getgrnam(p);
 		if(grp)
 		    chm.gid = grp->gr_gid;
@@ -772,6 +788,11 @@
 			return 1;
 		    }
 		}
+#else /* !USE_GETGRNAM */
+		zwarnnam(nam, "%s: getgrnam not usable in static build", p);
+		free(uspec);
+		return 1;
+#endif /* !USE_GETGRNAM */
 	    }
 	 } else
 	    chm.gid = -1;