Print this page
2989 Eliminate use of LOGNAME_MAX in ON
1166 useradd have warning with name more 8 chars
Split |
Close |
Expand all |
Collapse all |
--- old/usr/src/cmd/pwck/pwck.c
+++ new/usr/src/cmd/pwck/pwck.c
1 1 /*
2 2 * CDDL HEADER START
3 3 *
4 4 * The contents of this file are subject to the terms of the
5 5 * Common Development and Distribution License (the "License").
6 6 * You may not use this file except in compliance with the License.
7 7 *
8 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 9 * or http://www.opensolaris.org/os/licensing.
10 10 * See the License for the specific language governing permissions
11 11 * and limitations under the License.
↓ open down ↓ |
11 lines elided |
↑ open up ↑ |
12 12 *
13 13 * When distributing Covered Code, include this CDDL HEADER in each
14 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 15 * If applicable, add the following below this CDDL HEADER, with the
16 16 * fields enclosed by brackets "[]" replaced with your own identifying
17 17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 18 *
19 19 * CDDL HEADER END
20 20 */
21 21 /*
22 + * Copyright (c) 2013 Gary Mills
23 + *
22 24 * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
23 25 * Use is subject to license terms.
24 26 */
25 27
26 28 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
27 29 /* All Rights Reserved */
28 30
29 31
30 -#pragma ident "%Z%%M% %I% %E% SMI"
31 -
32 32 #include <sys/types.h>
33 33 #include <sys/param.h>
34 34 #include <sys/signal.h>
35 35 #include <sys/sysmacros.h>
36 36 #include <sys/stat.h>
37 37 #include <stdio.h>
38 38 #include <stdlib.h>
39 39 #include <string.h>
40 40 #include <ctype.h>
41 41 #include <locale.h>
42 42 #include <errno.h>
43 43 #include <unistd.h>
44 +#include <limits.h>
44 45
45 46 #define ERROR1 "Too many/few fields"
46 47 #define ERROR2 "Bad character(s) in logname"
47 48 #define ERROR2a "First char in logname not alphabetic"
48 49 #define ERROR2b "Logname field NULL"
49 50 #define ERROR2c "Logname contains no lower-case letters"
50 51 #define ERROR3 "Logname too long/short"
51 52 #define ERROR4 "Invalid UID"
52 53 #define ERROR5 "Invalid GID"
53 54 #define ERROR6 "Login directory not found"
54 55 #define ERROR6a "Login directory null"
55 56 #define ERROR7 "Optional shell file not found"
56 57
57 58 static int eflag, code = 0;
58 59 static int badc;
59 60 static int lc;
60 61 static char buf[512];
61 62 static void error(char *);
62 63
63 64 int
64 65 main(int argc, char **argv)
65 66 {
66 67 int delim[512];
67 68 char logbuf[512];
68 69 FILE *fptr;
69 70 struct stat obuf;
70 71 uid_t uid;
71 72 gid_t gid;
72 73 int i, j, colons;
73 74 char *pw_file;
74 75 struct stat stat_buf;
75 76 char *str, *lastc;
76 77
77 78 (void) setlocale(LC_ALL, "");
78 79
79 80 #if !defined(TEXT_DOMAIN) /* Should be defined by cc -D */
80 81 #define TEXT_DOMAIN "SYS_TEST"
81 82 #endif
82 83 (void) textdomain(TEXT_DOMAIN);
83 84
84 85 if (argc == 1)
85 86 pw_file = "/etc/passwd";
86 87 else
87 88 pw_file = argv[1];
88 89
89 90 if ((fptr = fopen(pw_file, "r")) == NULL) {
90 91 (void) fprintf(stderr, gettext("cannot open %s\n"), pw_file);
91 92 exit(1);
92 93 }
93 94
94 95 if (fstat(fileno(fptr), &stat_buf) < 0) {
95 96 (void) fprintf(stderr, gettext("fstat failed for %s\n"),
96 97 pw_file);
97 98 (void) fclose(fptr);
98 99 exit(1);
99 100 }
100 101
101 102 if (stat_buf.st_size == 0) {
102 103 (void) fprintf(stderr, gettext("file %s is empty\n"), pw_file);
103 104 (void) fclose(fptr);
104 105 exit(1);
105 106 }
106 107
107 108 while (fgets(buf, sizeof (buf), fptr) != NULL) {
108 109
109 110 colons = 0;
110 111 badc = 0;
111 112 lc = 0;
112 113 eflag = 0;
113 114
114 115 /* Check that entry is not a nameservice redirection */
115 116
116 117 if (buf[0] == '+' || buf[0] == '-') {
117 118 /*
118 119 * Should set flag here to allow special case checking
119 120 * in the rest of the code,
120 121 * but for now, we'll just ignore this entry.
121 122 */
122 123 continue;
123 124 }
124 125
125 126 /* Check number of fields */
126 127
127 128 for (i = 0; buf[i] != NULL; i++)
128 129 if (buf[i] == ':') {
129 130 delim[colons] = i;
130 131 ++colons;
131 132 }
132 133
133 134 if (colons != 6) {
134 135 error(ERROR1);
135 136 continue;
136 137 }
137 138 delim[6] = i - 1;
138 139 delim[7] = NULL;
139 140
140 141 /*
141 142 * Check the first char is alpha; the rest alphanumeric;
↓ open down ↓ |
88 lines elided |
↑ open up ↑ |
142 143 * and that the name does not consist solely of uppercase
143 144 * alpha chars
144 145 */
145 146 if (buf[0] == ':')
146 147 error(ERROR2b);
147 148 else if (!isalpha(buf[0]))
148 149 error(ERROR2a);
149 150
150 151 for (i = 0; buf[i] != ':'; i++) {
151 152 if (!isalnum(buf[i]) &&
152 - buf[i] != '_' &&
153 - buf[i] != '-' &&
154 - buf[i] != '.')
153 + buf[i] != '_' &&
154 + buf[i] != '-' &&
155 + buf[i] != '.')
155 156 badc++;
156 157 else if (islower(buf[i]))
157 158 lc++;
158 159 }
159 160 if (lc == 0)
160 161 error(ERROR2c);
161 162 if (badc > 0)
162 163 error(ERROR2);
163 164
164 165 /* Check for valid number of characters in logname */
165 166
166 - if (i <= 0 || i > 8)
167 + if (i <= 0 || i > LOGNAME_MAX)
167 168 error(ERROR3);
168 169
169 170 /* Check that UID is numeric and <= MAXUID */
170 171
171 172 errno = 0;
172 173 str = &buf[delim[1] + 1];
173 174 uid = strtol(str, &lastc, 10);
174 175 if (lastc != str + (delim[2] - delim[1]) - 1 ||
175 176 uid > MAXUID || errno == ERANGE)
176 177 error(ERROR4);
177 178
178 179 /* Check that GID is numeric and <= MAXUID */
179 180
180 181 errno = 0;
181 182 str = &buf[delim[2] + 1];
182 183 gid = strtol(str, &lastc, 10);
183 184 if (lastc != str + (delim[3] - delim[2]) - 1 ||
184 185 gid > MAXUID || errno == ERANGE)
185 186 error(ERROR5);
186 187
187 188 /* Check initial working directory */
188 189
189 190 for (j = 0, i = (delim[4] + 1); i < delim[5]; j++, i++)
190 191 logbuf[j] = buf[i];
191 192 logbuf[j] = '\0';
192 193
193 194 if (logbuf[0] == NULL)
194 195 error(ERROR6a);
195 196 else if ((stat(logbuf, &obuf)) == -1)
196 197 error(ERROR6);
197 198
198 199 /* Check program to use as shell */
199 200
200 201 if ((buf[(delim[5] + 1)]) != '\n') {
201 202
202 203 for (j = 0, i = (delim[5] + 1); i < delim[6]; j++, i++)
203 204 logbuf[j] = buf[i];
204 205 logbuf[j] = '\0';
205 206
206 207 if (strcmp(logbuf, "*") == 0) /* subsystem login */
207 208 continue;
208 209
209 210 if ((stat(logbuf, &obuf)) == -1)
210 211 error(ERROR7);
211 212
212 213 for (j = 0; j < 512; j++)
213 214 logbuf[j] = NULL;
214 215 }
215 216 }
216 217 (void) fclose(fptr);
217 218 return (code);
218 219 }
219 220
220 221 /* Error printing routine */
221 222
222 223 static void
223 224 error(char *msg)
224 225 {
225 226 if (!eflag) {
226 227 (void) fprintf(stderr, "\n%s", buf);
227 228 code = 1;
228 229 ++eflag;
229 230 }
230 231 if (!badc)
231 232 (void) fprintf(stderr, "\t%s\n", gettext(msg));
232 233 else {
233 234 (void) fprintf(stderr, "\t%d %s\n", badc, gettext(msg));
234 235 badc = 0;
235 236 }
236 237 }
↓ open down ↓ |
60 lines elided |
↑ open up ↑ |
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX