File: | src/libexec/ftpd/obj/ftpcmd.c |
Warning: | line 1147, column 18 Use of zero-allocated memory |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
1 | #include <stdlib.h> | ||||
2 | #include <string.h> | ||||
3 | #define YYBYACC1 1 | ||||
4 | #define YYMAJOR1 1 | ||||
5 | #define YYMINOR9 9 | ||||
6 | #define YYLEXyylex() yylex() | ||||
7 | #define YYEMPTY-1 -1 | ||||
8 | #define yyclearin(yychar=(-1)) (yychar=(YYEMPTY-1)) | ||||
9 | #define yyerrok(yyerrflag=0) (yyerrflag=0) | ||||
10 | #define YYRECOVERING()(yyerrflag!=0) (yyerrflag!=0) | ||||
11 | #define YYPREFIX"yy" "yy" | ||||
12 | #line 41 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
13 | |||||
14 | #include <sys/types.h> | ||||
15 | #include <sys/socket.h> | ||||
16 | #include <sys/stat.h> | ||||
17 | |||||
18 | #include <netinet/in.h> | ||||
19 | #include <arpa/ftp.h> | ||||
20 | |||||
21 | #include <ctype.h> | ||||
22 | #include <errno(*__errno()).h> | ||||
23 | #include <glob.h> | ||||
24 | #include <pwd.h> | ||||
25 | #include <signal.h> | ||||
26 | #include <stdio.h> | ||||
27 | #include <stdlib.h> | ||||
28 | #include <string.h> | ||||
29 | #include <syslog.h> | ||||
30 | #include <time.h> | ||||
31 | #include <unistd.h> | ||||
32 | #include <netdb.h> | ||||
33 | #include <limits.h> | ||||
34 | |||||
35 | #include "monitor.h" | ||||
36 | #include "extern.h" | ||||
37 | |||||
38 | extern union sockunion data_dest; | ||||
39 | extern int logged_in; | ||||
40 | extern struct passwd *pw; | ||||
41 | extern int guest; | ||||
42 | extern int logging; | ||||
43 | extern int type; | ||||
44 | extern int form; | ||||
45 | extern int debug; | ||||
46 | extern int timeout; | ||||
47 | extern int maxtimeout; | ||||
48 | extern int pdata; | ||||
49 | extern char hostname[], remotehost[]; | ||||
50 | extern char proctitle[]; | ||||
51 | extern int usedefault; | ||||
52 | extern int transflag; | ||||
53 | extern char tmpline[]; | ||||
54 | extern int portcheck; | ||||
55 | extern union sockunion his_addr; | ||||
56 | extern int umaskchange; | ||||
57 | |||||
58 | off_t restart_point; | ||||
59 | |||||
60 | static int cmd_type; | ||||
61 | static int cmd_form; | ||||
62 | static int cmd_bytesz; | ||||
63 | static int state; | ||||
64 | static int quit; | ||||
65 | char cbuf[512]; | ||||
66 | char *fromname; | ||||
67 | |||||
68 | #line 98 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
69 | #ifndef YYSTYPE_DEFINED | ||||
70 | #define YYSTYPE_DEFINED | ||||
71 | typedef union { | ||||
72 | int i; | ||||
73 | off_t o; | ||||
74 | char *s; | ||||
75 | } YYSTYPE; | ||||
76 | #endif /* YYSTYPE_DEFINED */ | ||||
77 | #line 78 "ftpcmd.c" | ||||
78 | #define A257 257 | ||||
79 | #define B258 258 | ||||
80 | #define C259 259 | ||||
81 | #define E260 260 | ||||
82 | #define F261 261 | ||||
83 | #define I262 262 | ||||
84 | #define L263 263 | ||||
85 | #define N264 264 | ||||
86 | #define P265 265 | ||||
87 | #define R266 266 | ||||
88 | #define S267 267 | ||||
89 | #define T268 268 | ||||
90 | #define SP269 269 | ||||
91 | #define CRLF270 270 | ||||
92 | #define COMMA271 271 | ||||
93 | #define ALL272 272 | ||||
94 | #define USER273 273 | ||||
95 | #define PASS274 274 | ||||
96 | #define ACCT275 275 | ||||
97 | #define REIN276 276 | ||||
98 | #define QUIT277 277 | ||||
99 | #define PORT278 278 | ||||
100 | #define PASV279 279 | ||||
101 | #define TYPE280 280 | ||||
102 | #define STRU281 281 | ||||
103 | #define MODE282 282 | ||||
104 | #define RETR283 283 | ||||
105 | #define STOR284 284 | ||||
106 | #define APPE285 285 | ||||
107 | #define MLFL286 286 | ||||
108 | #define MAIL287 287 | ||||
109 | #define MSND288 288 | ||||
110 | #define MSOM289 289 | ||||
111 | #define MSAM290 290 | ||||
112 | #define MRSQ291 291 | ||||
113 | #define MRCP292 292 | ||||
114 | #define ALLO293 293 | ||||
115 | #define REST294 294 | ||||
116 | #define RNFR295 295 | ||||
117 | #define RNTO296 296 | ||||
118 | #define ABOR297 297 | ||||
119 | #define DELE298 298 | ||||
120 | #define CWD299 299 | ||||
121 | #define LIST300 300 | ||||
122 | #define NLST301 301 | ||||
123 | #define SITE302 302 | ||||
124 | #define STAT303 303 | ||||
125 | #define HELP304 304 | ||||
126 | #define NOOP305 305 | ||||
127 | #define MKD306 306 | ||||
128 | #define RMD307 307 | ||||
129 | #define PWD308 308 | ||||
130 | #define CDUP309 309 | ||||
131 | #define STOU310 310 | ||||
132 | #define SMNT311 311 | ||||
133 | #define SYST312 312 | ||||
134 | #define SIZE313 313 | ||||
135 | #define MDTM314 314 | ||||
136 | #define LPRT315 315 | ||||
137 | #define LPSV316 316 | ||||
138 | #define EPRT317 317 | ||||
139 | #define EPSV318 318 | ||||
140 | #define UMASK319 319 | ||||
141 | #define IDLE320 320 | ||||
142 | #define CHMOD321 321 | ||||
143 | #define LEXERR322 322 | ||||
144 | #define STRING323 323 | ||||
145 | #define NUMBER324 324 | ||||
146 | #define BIGNUM325 325 | ||||
147 | #define YYERRCODE256 256 | ||||
148 | const short yylhs[] = | ||||
149 | { -1, | ||||
150 | 0, 0, 0, 17, 17, 17, 17, 17, 17, 17, | ||||
151 | 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, | ||||
152 | 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, | ||||
153 | 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, | ||||
154 | 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, | ||||
155 | 17, 17, 17, 18, 18, 16, 15, 15, 4, 12, | ||||
156 | 12, 9, 10, 11, 8, 8, 8, 7, 7, 7, | ||||
157 | 7, 7, 7, 7, 7, 5, 5, 5, 6, 6, | ||||
158 | 6, 14, 13, 3, 1, 2, | ||||
159 | }; | ||||
160 | const short yylen[] = | ||||
161 | { 2, | ||||
162 | 0, 2, 2, 4, 4, 5, 5, 5, 5, 3, | ||||
163 | 3, 5, 5, 3, 5, 5, 5, 5, 9, 5, | ||||
164 | 5, 5, 3, 5, 3, 5, 5, 3, 5, 5, | ||||
165 | 3, 3, 5, 2, 4, 2, 5, 5, 3, 3, | ||||
166 | 4, 6, 5, 7, 9, 5, 7, 5, 3, 5, | ||||
167 | 5, 2, 1, 5, 5, 1, 0, 1, 1, 1, | ||||
168 | 1, 11, 17, 41, 1, 1, 1, 1, 3, 1, | ||||
169 | 3, 1, 1, 3, 2, 1, 1, 1, 1, 1, | ||||
170 | 1, 1, 1, 1, 0, 0, | ||||
171 | }; | ||||
172 | const short yydefred[] = | ||||
173 | { 1, | ||||
174 | 0, 53, 0, 0, 0, 86, 86, 85, 85, 85, | ||||
175 | 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, | ||||
176 | 85, 85, 0, 85, 0, 0, 85, 85, 85, 85, | ||||
177 | 85, 85, 85, 85, 86, 86, 86, 85, 2, 3, | ||||
178 | 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, | ||||
179 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||||
180 | 0, 0, 0, 34, 36, 0, 0, 0, 0, 0, | ||||
181 | 0, 0, 0, 0, 0, 0, 0, 56, 0, 58, | ||||
182 | 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, | ||||
183 | 0, 0, 0, 31, 0, 0, 32, 0, 25, 0, | ||||
184 | 23, 0, 85, 85, 0, 0, 28, 0, 0, 0, | ||||
185 | 39, 40, 0, 49, 0, 0, 0, 11, 0, 0, | ||||
186 | 14, 4, 5, 0, 0, 0, 0, 72, 0, 0, | ||||
187 | 76, 78, 77, 0, 80, 81, 79, 0, 83, 82, | ||||
188 | 0, 0, 0, 0, 60, 61, 0, 0, 0, 0, | ||||
189 | 0, 0, 0, 0, 41, 0, 0, 0, 0, 35, | ||||
190 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||||
191 | 0, 0, 6, 0, 0, 0, 59, 75, 15, 16, | ||||
192 | 17, 20, 21, 22, 0, 18, 55, 54, 30, 29, | ||||
193 | 33, 26, 24, 0, 0, 43, 0, 0, 46, 27, | ||||
194 | 37, 38, 48, 50, 51, 0, 7, 8, 9, 13, | ||||
195 | 12, 0, 67, 65, 66, 69, 71, 74, 0, 42, | ||||
196 | 84, 0, 0, 0, 0, 0, 0, 44, 0, 47, | ||||
197 | 0, 0, 0, 0, 0, 0, 19, 45, 0, 0, | ||||
198 | 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, | ||||
199 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||||
200 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||||
201 | 0, 0, 0, 0, 0, 0, 0, 0, 64, | ||||
202 | }; | ||||
203 | const short yydgoto[] = | ||||
204 | { 1, | ||||
205 | 46, 44, 222, 178, 134, 138, 130, 216, 125, 167, | ||||
206 | 168, 147, 140, 141, 81, 79, 39, 40, | ||||
207 | }; | ||||
208 | const short yysindex[] = | ||||
209 | { 0, | ||||
210 | -211, 0, -263, -256, -253, 0, 0, 0, 0, 0, | ||||
211 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||||
212 | 0, 0, -226, 0, -254, -224, 0, 0, 0, 0, | ||||
213 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||||
214 | -264, -244, 0, -169, -155, -147, -136, -135, -134, -133, | ||||
215 | -132, -131, -130, -129, -127, -126, -124, -194, -192, -157, | ||||
216 | -295, -151, -180, 0, 0, -123, -122, -121, -120, -118, | ||||
217 | -117, -115, -114, -113, -112, -110, -149, 0, -109, 0, | ||||
218 | -108, -176, 0, -146, -205, -247, -171, -171, -171, -167, | ||||
219 | -260, -171, -171, 0, -171, -171, 0, -171, 0, -163, | ||||
220 | 0, -144, 0, 0, -156, -171, 0, -107, -171, -171, | ||||
221 | 0, 0, -171, 0, -171, -171, -159, 0, -154, -269, | ||||
222 | 0, 0, 0, -105, -103, -101, -99, 0, -267, -98, | ||||
223 | 0, 0, 0, -97, 0, 0, 0, -96, 0, 0, | ||||
224 | -95, -94, -93, -142, 0, 0, -92, -91, -90, -89, | ||||
225 | -87, -86, -85, -152, 0, -140, -83, -138, -82, 0, | ||||
226 | -81, -80, -79, -78, -77, -84, -76, -75, -74, -73, | ||||
227 | -72, -125, 0, -245, -245, -119, 0, 0, 0, 0, | ||||
228 | 0, 0, 0, 0, -66, 0, 0, 0, 0, 0, | ||||
229 | 0, 0, 0, -69, -116, 0, -116, -111, 0, 0, | ||||
230 | 0, 0, 0, 0, 0, -106, 0, 0, 0, 0, | ||||
231 | 0, -68, 0, 0, 0, 0, 0, 0, -67, 0, | ||||
232 | 0, -64, -65, -63, -62, -104, -102, 0, -171, 0, | ||||
233 | -100, -61, -59, -58, -57, -71, 0, 0, -70, -56, | ||||
234 | -55, -60, -54, -52, -50, -53, -51, 0, -48, -49, | ||||
235 | -46, -47, -45, -44, -43, -42, -41, -40, -39, -38, | ||||
236 | -37, -36, -35, -34, -33, -32, -31, -30, -29, -28, | ||||
237 | -27, -26, -25, -24, -23, -22, -21, -20, 0,}; | ||||
238 | const short yyrindex[] = | ||||
239 | { 0, | ||||
240 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||||
241 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||||
242 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||||
243 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||||
244 | 0, -19, 0, 0, 0, 0, 0, 0, 0, 0, | ||||
245 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||||
246 | -17, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||||
247 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||||
248 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||||
249 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||||
250 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||||
251 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||||
252 | 0, 0, 0, 0, 0, -18, -15, 0, -14, 0, | ||||
253 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||||
254 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||||
255 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||||
256 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||||
257 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||||
258 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||||
259 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||||
260 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||||
261 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||||
262 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||||
263 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||||
264 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||||
265 | 0, 0, 0, 0, -13, 0, 0, 0, 0, 0, | ||||
266 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||||
267 | 0, 0, 0, 0, 0, 0, 0, 0, 0,}; | ||||
268 | const short yygindex[] = | ||||
269 | { 0, | ||||
270 | 20, 73, 30, 6, 0, 0, 0, 42, 0, 0, | ||||
271 | 0, 0, 0, -88, 0, 0, 0, 0, | ||||
272 | }; | ||||
273 | #define YYTABLESIZE304 304 | ||||
274 | const short yytable[] = | ||||
275 | { 142, | ||||
276 | 143, 176, 170, 148, 149, 41, 150, 151, 102, 152, | ||||
277 | 135, 136, 42, 213, 63, 64, 43, 159, 214, 137, | ||||
278 | 161, 162, 215, 103, 163, 104, 164, 165, 47, 48, | ||||
279 | 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, | ||||
280 | 59, 60, 61, 62, 2, 65, 66, 67, 68, 69, | ||||
281 | 70, 71, 72, 73, 171, 131, 177, 77, 78, 132, | ||||
282 | 133, 3, 4, 145, 146, 5, 6, 7, 8, 9, | ||||
283 | 10, 11, 12, 13, 96, 97, 98, 99, 80, 45, | ||||
284 | 105, 14, 15, 16, 17, 18, 19, 20, 21, 22, | ||||
285 | 23, 24, 25, 26, 27, 28, 29, 30, 31, 82, | ||||
286 | 32, 33, 34, 35, 36, 37, 38, 74, 75, 76, | ||||
287 | 126, 100, 101, 127, 83, 128, 129, 106, 107, 120, | ||||
288 | 121, 84, 156, 157, 154, 155, 185, 186, 195, 196, | ||||
289 | 198, 199, 85, 86, 87, 88, 89, 90, 91, 92, | ||||
290 | 234, 93, 108, 94, 95, 109, 110, 124, 111, 112, | ||||
291 | 113, 139, 114, 115, 116, 117, 144, 118, 119, 153, | ||||
292 | 122, 123, 160, 158, 166, 172, 173, 174, 169, 175, | ||||
293 | 194, 179, 180, 181, 182, 183, 184, 187, 188, 189, | ||||
294 | 190, 218, 191, 192, 193, 197, 206, 200, 201, 202, | ||||
295 | 203, 204, 205, 207, 208, 209, 210, 211, 212, 219, | ||||
296 | 220, 227, 226, 229, 177, 228, 230, 221, 231, 236, | ||||
297 | 237, 238, 224, 239, 242, 243, 217, 225, 246, 232, | ||||
298 | 247, 233, 250, 235, 252, 254, 223, 256, 0, 258, | ||||
299 | 0, 260, 0, 262, 0, 264, 0, 266, 0, 268, | ||||
300 | 0, 270, 0, 272, 0, 274, 0, 276, 0, 278, | ||||
301 | 57, 68, 240, 241, 70, 73, 63, 0, 0, 0, | ||||
302 | 0, 0, 0, 244, 0, 0, 0, 0, 0, 245, | ||||
303 | 248, 0, 249, 0, 251, 0, 253, 0, 0, 255, | ||||
304 | 0, 257, 0, 259, 0, 261, 0, 263, 0, 265, | ||||
305 | 0, 267, 0, 269, 0, 271, 0, 273, 0, 275, | ||||
306 | 0, 277, 85, 279, | ||||
307 | }; | ||||
308 | const short yycheck[] = | ||||
309 | { 88, | ||||
310 | 89, 269, 272, 92, 93, 269, 95, 96, 304, 98, | ||||
311 | 258, 259, 269, 259, 269, 270, 270, 106, 264, 267, | ||||
312 | 109, 110, 268, 319, 113, 321, 115, 116, 9, 10, | ||||
313 | 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, | ||||
314 | 21, 22, 269, 24, 256, 270, 27, 28, 29, 30, | ||||
315 | 31, 32, 33, 34, 324, 261, 324, 38, 323, 265, | ||||
316 | 266, 273, 274, 324, 325, 277, 278, 279, 280, 281, | ||||
317 | 282, 283, 284, 285, 269, 270, 269, 270, 323, 7, | ||||
318 | 61, 293, 294, 295, 296, 297, 298, 299, 300, 301, | ||||
319 | 302, 303, 304, 305, 306, 307, 308, 309, 310, 269, | ||||
320 | 312, 313, 314, 315, 316, 317, 318, 35, 36, 37, | ||||
321 | 257, 269, 270, 260, 270, 262, 263, 269, 270, 269, | ||||
322 | 270, 269, 103, 104, 269, 270, 269, 270, 269, 270, | ||||
323 | 269, 270, 269, 269, 269, 269, 269, 269, 269, 269, | ||||
324 | 229, 269, 323, 270, 269, 269, 269, 324, 270, 270, | ||||
325 | 269, 323, 270, 269, 269, 269, 324, 270, 269, 323, | ||||
326 | 270, 270, 270, 320, 324, 271, 270, 269, 323, 269, | ||||
327 | 323, 270, 270, 270, 270, 270, 270, 270, 270, 270, | ||||
328 | 270, 176, 270, 270, 270, 269, 271, 270, 270, 270, | ||||
329 | 270, 270, 270, 270, 270, 270, 270, 270, 324, 266, | ||||
330 | 270, 269, 271, 269, 324, 270, 270, 324, 271, 271, | ||||
331 | 270, 270, 324, 271, 271, 271, 175, 324, 271, 324, | ||||
332 | 271, 324, 271, 324, 271, 271, 197, 271, -1, 271, | ||||
333 | -1, 271, -1, 271, -1, 271, -1, 271, -1, 271, | ||||
334 | -1, 271, -1, 271, -1, 271, -1, 271, -1, 271, | ||||
335 | 270, 270, 324, 324, 270, 270, 270, -1, -1, -1, | ||||
336 | -1, -1, -1, 324, -1, -1, -1, -1, -1, 324, | ||||
337 | 324, -1, 324, -1, 324, -1, 324, -1, -1, 324, | ||||
338 | -1, 324, -1, 324, -1, 324, -1, 324, -1, 324, | ||||
339 | -1, 324, -1, 324, -1, 324, -1, 324, -1, 324, | ||||
340 | -1, 324, 320, 324, | ||||
341 | }; | ||||
342 | #define YYFINAL1 1 | ||||
343 | #ifndef YYDEBUG0 | ||||
344 | #define YYDEBUG0 0 | ||||
345 | #endif | ||||
346 | #define YYMAXTOKEN325 325 | ||||
347 | #if YYDEBUG0 | ||||
348 | const char * const yyname[] = | ||||
349 | { | ||||
350 | "end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, | ||||
351 | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, | ||||
352 | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, | ||||
353 | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, | ||||
354 | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, | ||||
355 | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, | ||||
356 | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A","B","C","E","F","I","L","N", | ||||
357 | "P","R","S","T","SP","CRLF","COMMA","ALL","USER","PASS","ACCT","REIN","QUIT", | ||||
358 | "PORT","PASV","TYPE","STRU","MODE","RETR","STOR","APPE","MLFL","MAIL","MSND", | ||||
359 | "MSOM","MSAM","MRSQ","MRCP","ALLO","REST","RNFR","RNTO","ABOR","DELE","CWD", | ||||
360 | "LIST","NLST","SITE","STAT","HELP","NOOP","MKD","RMD","PWD","CDUP","STOU", | ||||
361 | "SMNT","SYST","SIZE","MDTM","LPRT","LPSV","EPRT","EPSV","UMASK","IDLE","CHMOD", | ||||
362 | "LEXERR","STRING","NUMBER","BIGNUM", | ||||
363 | }; | ||||
364 | const char * const yyrule[] = | ||||
365 | {"$accept : cmd_list", | ||||
366 | "cmd_list :", | ||||
367 | "cmd_list : cmd_list cmd", | ||||
368 | "cmd_list : cmd_list rcmd", | ||||
369 | "cmd : USER SP username CRLF", | ||||
370 | "cmd : PASS SP password CRLF", | ||||
371 | "cmd : PORT check_login_epsvall SP host_port CRLF", | ||||
372 | "cmd : LPRT check_login_epsvall SP host_long_port4 CRLF", | ||||
373 | "cmd : LPRT check_login_epsvall SP host_long_port6 CRLF", | ||||
374 | "cmd : EPRT check_login_epsvall SP STRING CRLF", | ||||
375 | "cmd : PASV check_login_epsvall CRLF", | ||||
376 | "cmd : LPSV check_login_epsvall CRLF", | ||||
377 | "cmd : EPSV check_login SP NUMBER CRLF", | ||||
378 | "cmd : EPSV check_login SP ALL CRLF", | ||||
379 | "cmd : EPSV check_login CRLF", | ||||
380 | "cmd : TYPE check_login SP type_code CRLF", | ||||
381 | "cmd : STRU check_login SP struct_code CRLF", | ||||
382 | "cmd : MODE check_login SP mode_code CRLF", | ||||
383 | "cmd : ALLO check_login SP NUMBER CRLF", | ||||
384 | "cmd : ALLO check_login SP NUMBER SP R SP NUMBER CRLF", | ||||
385 | "cmd : RETR check_login SP pathname CRLF", | ||||
386 | "cmd : STOR check_login SP pathname CRLF", | ||||
387 | "cmd : APPE check_login SP pathname CRLF", | ||||
388 | "cmd : NLST check_login CRLF", | ||||
389 | "cmd : NLST check_login SP STRING CRLF", | ||||
390 | "cmd : LIST check_login CRLF", | ||||
391 | "cmd : LIST check_login SP pathname CRLF", | ||||
392 | "cmd : STAT check_login SP pathname CRLF", | ||||
393 | "cmd : STAT check_login CRLF", | ||||
394 | "cmd : DELE check_login SP pathname CRLF", | ||||
395 | "cmd : RNTO check_login SP pathname CRLF", | ||||
396 | "cmd : ABOR check_login CRLF", | ||||
397 | "cmd : CWD check_login CRLF", | ||||
398 | "cmd : CWD check_login SP pathname CRLF", | ||||
399 | "cmd : HELP CRLF", | ||||
400 | "cmd : HELP SP STRING CRLF", | ||||
401 | "cmd : NOOP CRLF", | ||||
402 | "cmd : MKD check_login SP pathname CRLF", | ||||
403 | "cmd : RMD check_login SP pathname CRLF", | ||||
404 | "cmd : PWD check_login CRLF", | ||||
405 | "cmd : CDUP check_login CRLF", | ||||
406 | "cmd : SITE SP HELP CRLF", | ||||
407 | "cmd : SITE SP HELP SP STRING CRLF", | ||||
408 | "cmd : SITE SP UMASK check_login CRLF", | ||||
409 | "cmd : SITE SP UMASK check_login SP octal_number CRLF", | ||||
410 | "cmd : SITE SP CHMOD check_login SP octal_number SP pathname CRLF", | ||||
411 | "cmd : SITE SP check_login IDLE CRLF", | ||||
412 | "cmd : SITE SP check_login IDLE SP NUMBER CRLF", | ||||
413 | "cmd : STOU check_login SP pathname CRLF", | ||||
414 | "cmd : SYST check_login CRLF", | ||||
415 | "cmd : SIZE check_login SP pathname CRLF", | ||||
416 | "cmd : MDTM check_login SP pathname CRLF", | ||||
417 | "cmd : QUIT CRLF", | ||||
418 | "cmd : error", | ||||
419 | "rcmd : RNFR check_login SP pathname CRLF", | ||||
420 | "rcmd : REST check_login SP file_size CRLF", | ||||
421 | "username : STRING", | ||||
422 | "password :", | ||||
423 | "password : STRING", | ||||
424 | "byte_size : NUMBER", | ||||
425 | "file_size : NUMBER", | ||||
426 | "file_size : BIGNUM", | ||||
427 | "host_port : NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER", | ||||
428 | "host_long_port4 : NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER", | ||||
429 | "host_long_port6 : NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER", | ||||
430 | "form_code : N", | ||||
431 | "form_code : T", | ||||
432 | "form_code : C", | ||||
433 | "type_code : A", | ||||
434 | "type_code : A SP form_code", | ||||
435 | "type_code : E", | ||||
436 | "type_code : E SP form_code", | ||||
437 | "type_code : I", | ||||
438 | "type_code : L", | ||||
439 | "type_code : L SP byte_size", | ||||
440 | "type_code : L byte_size", | ||||
441 | "struct_code : F", | ||||
442 | "struct_code : R", | ||||
443 | "struct_code : P", | ||||
444 | "mode_code : S", | ||||
445 | "mode_code : B", | ||||
446 | "mode_code : C", | ||||
447 | "pathname : pathstring", | ||||
448 | "pathstring : STRING", | ||||
449 | "octal_number : NUMBER", | ||||
450 | "check_login :", | ||||
451 | "check_login_epsvall :", | ||||
452 | }; | ||||
453 | #endif | ||||
454 | #ifdef YYSTACKSIZE10000 | ||||
455 | #undef YYMAXDEPTH10000 | ||||
456 | #define YYMAXDEPTH10000 YYSTACKSIZE10000 | ||||
457 | #else | ||||
458 | #ifdef YYMAXDEPTH10000 | ||||
459 | #define YYSTACKSIZE10000 YYMAXDEPTH10000 | ||||
460 | #else | ||||
461 | #define YYSTACKSIZE10000 10000 | ||||
462 | #define YYMAXDEPTH10000 10000 | ||||
463 | #endif | ||||
464 | #endif | ||||
465 | #define YYINITSTACKSIZE200 200 | ||||
466 | /* LINTUSED */ | ||||
467 | int yydebug; | ||||
468 | int yynerrs; | ||||
469 | int yyerrflag; | ||||
470 | int yychar; | ||||
471 | short *yyssp; | ||||
472 | YYSTYPE *yyvsp; | ||||
473 | YYSTYPE yyval; | ||||
474 | YYSTYPE yylval; | ||||
475 | short *yyss; | ||||
476 | short *yysslim; | ||||
477 | YYSTYPE *yyvs; | ||||
478 | unsigned int yystacksize; | ||||
479 | int yyparse(void); | ||||
480 | #line 984 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
481 | |||||
482 | #define CMD0 0 /* beginning of command */ | ||||
483 | #define ARGS1 1 /* expect miscellaneous arguments */ | ||||
484 | #define STR12 2 /* expect SP followed by STRING */ | ||||
485 | #define STR23 3 /* expect STRING */ | ||||
486 | #define OSTR4 4 /* optional SP then STRING */ | ||||
487 | #define ZSTR15 5 /* SP then optional STRING */ | ||||
488 | #define ZSTR26 6 /* optional STRING after SP */ | ||||
489 | #define SITECMD7 7 /* SITE command */ | ||||
490 | #define NSTR8 8 /* Number followed by a string */ | ||||
491 | |||||
492 | struct tab { | ||||
493 | char *name; | ||||
494 | short token; | ||||
495 | short state; | ||||
496 | short implemented; /* 1 if command is implemented */ | ||||
497 | char *help; | ||||
498 | }; | ||||
499 | |||||
500 | struct tab cmdtab[] = { /* In order defined in RFC 765 */ | ||||
501 | { "USER", USER273, STR12, 1, "<sp> username" }, | ||||
502 | { "PASS", PASS274, ZSTR15, 1, "<sp> password" }, | ||||
503 | { "ACCT", ACCT275, STR12, 0, "(specify account)" }, | ||||
504 | { "SMNT", SMNT311, ARGS1, 0, "(structure mount)" }, | ||||
505 | { "REIN", REIN276, ARGS1, 0, "(reinitialize server state)" }, | ||||
506 | { "QUIT", QUIT277, ARGS1, 1, "(terminate service)", }, | ||||
507 | { "PORT", PORT278, ARGS1, 1, "<sp> b0, b1, b2, b3, b4" }, | ||||
508 | { "LPRT", LPRT315, ARGS1, 1, "<sp> af, hal, h1, h2, h3,..., pal, p1, p2..." }, | ||||
509 | { "EPRT", EPRT317, STR12, 1, "<sp> |af|addr|port|" }, | ||||
510 | { "PASV", PASV279, ARGS1, 1, "(set server in passive mode)" }, | ||||
511 | { "LPSV", LPSV316, ARGS1, 1, "(set server in passive mode)" }, | ||||
512 | { "EPSV", EPSV318, ARGS1, 1, "[<sp> af|ALL]" }, | ||||
513 | { "TYPE", TYPE280, ARGS1, 1, "<sp> [ A | E | I | L ]" }, | ||||
514 | { "STRU", STRU281, ARGS1, 1, "(specify file structure)" }, | ||||
515 | { "MODE", MODE282, ARGS1, 1, "(specify transfer mode)" }, | ||||
516 | { "RETR", RETR283, STR12, 1, "<sp> file-name" }, | ||||
517 | { "STOR", STOR284, STR12, 1, "<sp> file-name" }, | ||||
518 | { "APPE", APPE285, STR12, 1, "<sp> file-name" }, | ||||
519 | { "MLFL", MLFL286, OSTR4, 0, "(mail file)" }, | ||||
520 | { "MAIL", MAIL287, OSTR4, 0, "(mail to user)" }, | ||||
521 | { "MSND", MSND288, OSTR4, 0, "(mail send to terminal)" }, | ||||
522 | { "MSOM", MSOM289, OSTR4, 0, "(mail send to terminal or mailbox)" }, | ||||
523 | { "MSAM", MSAM290, OSTR4, 0, "(mail send to terminal and mailbox)" }, | ||||
524 | { "MRSQ", MRSQ291, OSTR4, 0, "(mail recipient scheme question)" }, | ||||
525 | { "MRCP", MRCP292, STR12, 0, "(mail recipient)" }, | ||||
526 | { "ALLO", ALLO293, ARGS1, 1, "allocate storage (vacuously)" }, | ||||
527 | { "REST", REST294, ARGS1, 1, "<sp> offset (restart command)" }, | ||||
528 | { "RNFR", RNFR295, STR12, 1, "<sp> file-name" }, | ||||
529 | { "RNTO", RNTO296, STR12, 1, "<sp> file-name" }, | ||||
530 | { "ABOR", ABOR297, ARGS1, 1, "(abort operation)" }, | ||||
531 | { "DELE", DELE298, STR12, 1, "<sp> file-name" }, | ||||
532 | { "CWD", CWD299, OSTR4, 1, "[ <sp> directory-name ]" }, | ||||
533 | { "XCWD", CWD299, OSTR4, 1, "[ <sp> directory-name ]" }, | ||||
534 | { "LIST", LIST300, OSTR4, 1, "[ <sp> path-name ]" }, | ||||
535 | { "NLST", NLST301, OSTR4, 1, "[ <sp> path-name ]" }, | ||||
536 | { "SITE", SITE302, SITECMD7, 1, "site-cmd [ <sp> arguments ]" }, | ||||
537 | { "SYST", SYST312, ARGS1, 1, "(get type of operating system)" }, | ||||
538 | { "STAT", STAT303, OSTR4, 1, "[ <sp> path-name ]" }, | ||||
539 | { "HELP", HELP304, OSTR4, 1, "[ <sp> <string> ]" }, | ||||
540 | { "NOOP", NOOP305, ARGS1, 1, "" }, | ||||
541 | { "MKD", MKD306, STR12, 1, "<sp> path-name" }, | ||||
542 | { "XMKD", MKD306, STR12, 1, "<sp> path-name" }, | ||||
543 | { "RMD", RMD307, STR12, 1, "<sp> path-name" }, | ||||
544 | { "XRMD", RMD307, STR12, 1, "<sp> path-name" }, | ||||
545 | { "PWD", PWD308, ARGS1, 1, "(return current directory)" }, | ||||
546 | { "XPWD", PWD308, ARGS1, 1, "(return current directory)" }, | ||||
547 | { "CDUP", CDUP309, ARGS1, 1, "(change to parent directory)" }, | ||||
548 | { "XCUP", CDUP309, ARGS1, 1, "(change to parent directory)" }, | ||||
549 | { "STOU", STOU310, STR12, 1, "<sp> file-name" }, | ||||
550 | { "SIZE", SIZE313, OSTR4, 1, "<sp> path-name" }, | ||||
551 | { "MDTM", MDTM314, OSTR4, 1, "<sp> path-name" }, | ||||
552 | { NULL((void *)0), 0, 0, 0, 0 } | ||||
553 | }; | ||||
554 | |||||
555 | struct tab sitetab[] = { | ||||
556 | { "UMASK", UMASK319, ARGS1, 1, "[ <sp> umask ]" }, | ||||
557 | { "IDLE", IDLE320, ARGS1, 1, "[ <sp> maximum-idle-time ]" }, | ||||
558 | { "CHMOD", CHMOD321, NSTR8, 1, "<sp> mode <sp> file-name" }, | ||||
559 | { "HELP", HELP304, OSTR4, 1, "[ <sp> <string> ]" }, | ||||
560 | { NULL((void *)0), 0, 0, 0, 0 } | ||||
561 | }; | ||||
562 | |||||
563 | static void help(struct tab *, char *); | ||||
564 | static struct tab * | ||||
565 | lookup(struct tab *, const char *); | ||||
566 | static void sizecmd(const char *); | ||||
567 | static int yylex(void); | ||||
568 | |||||
569 | extern int epsvall; | ||||
570 | |||||
571 | static struct tab * | ||||
572 | lookup(struct tab *p, const char *cmd) | ||||
573 | { | ||||
574 | |||||
575 | for (; p->name != NULL((void *)0); p++) | ||||
576 | if (strcmp(cmd, p->name) == 0) | ||||
577 | return (p); | ||||
578 | return (NULL((void *)0)); | ||||
579 | } | ||||
580 | |||||
581 | #include <arpa/telnet.h> | ||||
582 | |||||
583 | /* | ||||
584 | * get_line - a hacked up version of fgets to ignore TELNET escape codes. | ||||
585 | */ | ||||
586 | int | ||||
587 | get_line(char *s, int n) | ||||
588 | { | ||||
589 | int c; | ||||
590 | char *cs; | ||||
591 | |||||
592 | cs = s; | ||||
593 | /* tmpline may contain saved command from urgent mode interruption */ | ||||
594 | for (c = 0; tmpline[c] != '\0' && --n > 0; ++c) { | ||||
595 | *cs++ = tmpline[c]; | ||||
596 | if (tmpline[c] == '\n') { | ||||
597 | *cs++ = '\0'; | ||||
598 | if (debug) | ||||
599 | syslog(LOG_DEBUG7, "command: %s", s); | ||||
600 | tmpline[0] = '\0'; | ||||
601 | return(0); | ||||
602 | } | ||||
603 | if (c == 0) | ||||
604 | tmpline[0] = '\0'; | ||||
605 | } | ||||
606 | while ((c = getc(stdin)(!__isthreaded ? (--((&__sF[0]))->_r < 0 ? __srget( (&__sF[0])) : (int)(*((&__sF[0]))->_p++)) : (getc) ((&__sF[0])))) != EOF(-1)) { | ||||
607 | c &= 0377; | ||||
608 | if (c == IAC255) { | ||||
609 | if ((c = getc(stdin)(!__isthreaded ? (--((&__sF[0]))->_r < 0 ? __srget( (&__sF[0])) : (int)(*((&__sF[0]))->_p++)) : (getc) ((&__sF[0])))) != EOF(-1)) { | ||||
610 | c &= 0377; | ||||
611 | switch (c) { | ||||
612 | case WILL251: | ||||
613 | case WONT252: | ||||
614 | c = getc(stdin)(!__isthreaded ? (--((&__sF[0]))->_r < 0 ? __srget( (&__sF[0])) : (int)(*((&__sF[0]))->_p++)) : (getc) ((&__sF[0]))); | ||||
615 | printf("%c%c%c", IAC255, DONT254, 0377&c); | ||||
616 | (void) fflush(stdout(&__sF[1])); | ||||
617 | continue; | ||||
618 | case DO253: | ||||
619 | case DONT254: | ||||
620 | c = getc(stdin)(!__isthreaded ? (--((&__sF[0]))->_r < 0 ? __srget( (&__sF[0])) : (int)(*((&__sF[0]))->_p++)) : (getc) ((&__sF[0]))); | ||||
621 | printf("%c%c%c", IAC255, WONT252, 0377&c); | ||||
622 | (void) fflush(stdout(&__sF[1])); | ||||
623 | continue; | ||||
624 | case IAC255: | ||||
625 | break; | ||||
626 | default: | ||||
627 | continue; /* ignore command */ | ||||
628 | } | ||||
629 | } | ||||
630 | } | ||||
631 | *cs++ = c; | ||||
632 | if (--n <= 0) { | ||||
633 | /* | ||||
634 | * If command doesn't fit into buffer, discard the | ||||
635 | * rest of the command and indicate truncation. | ||||
636 | * This prevents the command to be split up into | ||||
637 | * multiple commands. | ||||
638 | */ | ||||
639 | while (c != '\n' && (c = getc(stdin)(!__isthreaded ? (--((&__sF[0]))->_r < 0 ? __srget( (&__sF[0])) : (int)(*((&__sF[0]))->_p++)) : (getc) ((&__sF[0])))) != EOF(-1)) | ||||
640 | ; | ||||
641 | return (-2); | ||||
642 | } | ||||
643 | if (c == '\n') | ||||
644 | break; | ||||
645 | } | ||||
646 | if (c == EOF(-1) && cs == s) | ||||
647 | return (-1); | ||||
648 | *cs++ = '\0'; | ||||
649 | if (debug) { | ||||
650 | if (!guest && strncasecmp("pass ", s, 5) == 0) { | ||||
651 | /* Don't syslog passwords */ | ||||
652 | syslog(LOG_DEBUG7, "command: %.5s ???", s); | ||||
653 | } else { | ||||
654 | char *cp; | ||||
655 | int len; | ||||
656 | |||||
657 | /* Don't syslog trailing CR-LF */ | ||||
658 | len = strlen(s); | ||||
659 | cp = s + len - 1; | ||||
660 | while (cp >= s && (*cp == '\n' || *cp == '\r')) { | ||||
661 | --cp; | ||||
662 | --len; | ||||
663 | } | ||||
664 | syslog(LOG_DEBUG7, "command: %.*s", len, s); | ||||
665 | } | ||||
666 | } | ||||
667 | return (0); | ||||
668 | } | ||||
669 | |||||
670 | /*ARGSUSED*/ | ||||
671 | void | ||||
672 | toolong(int signo) | ||||
673 | { | ||||
674 | struct syslog_data sdata = SYSLOG_DATA_INIT{0, (const char *)0, (1<<3), 0xff}; | ||||
675 | |||||
676 | reply_r(421, | ||||
677 | "Timeout (%d seconds): closing control connection.", timeout); | ||||
678 | if (logging) | ||||
679 | syslog_r(LOG_INFO6, &sdata, "User %s timed out after %d seconds", | ||||
680 | (pw ? pw -> pw_name : "unknown"), timeout); | ||||
681 | dologout(1); | ||||
682 | } | ||||
683 | |||||
684 | static int | ||||
685 | yylex(void) | ||||
686 | { | ||||
687 | static int cpos; | ||||
688 | char *cp, *cp2; | ||||
689 | struct tab *p; | ||||
690 | int n; | ||||
691 | char c; | ||||
692 | |||||
693 | for (;;) { | ||||
694 | switch (state) { | ||||
695 | |||||
696 | case CMD0: | ||||
697 | (void) alarm((unsigned) timeout); | ||||
698 | n = get_line(cbuf, sizeof(cbuf)-1); | ||||
699 | if (n == -1) { | ||||
700 | reply(221, "You could at least say goodbye."); | ||||
701 | dologout(0); | ||||
702 | } else if (n == -2) { | ||||
703 | reply(500, "Command too long."); | ||||
704 | alarm(0); | ||||
705 | continue; | ||||
706 | } | ||||
707 | (void) alarm(0); | ||||
708 | if ((cp = strchr(cbuf, '\r'))) { | ||||
709 | *cp++ = '\n'; | ||||
710 | *cp = '\0'; | ||||
711 | } | ||||
712 | if (strncasecmp(cbuf, "PASS", 4) != 0) { | ||||
713 | if ((cp = strpbrk(cbuf, "\n"))) { | ||||
714 | c = *cp; | ||||
715 | *cp = '\0'; | ||||
716 | setproctitle("%s: %s", proctitle, cbuf); | ||||
717 | *cp = c; | ||||
718 | } | ||||
719 | } | ||||
720 | if ((cp = strpbrk(cbuf, " \n"))) | ||||
721 | cpos = cp - cbuf; | ||||
722 | if (cpos == 0) | ||||
723 | cpos = 4; | ||||
724 | c = cbuf[cpos]; | ||||
725 | cbuf[cpos] = '\0'; | ||||
726 | upper(cbuf); | ||||
727 | p = lookup(cmdtab, cbuf); | ||||
728 | cbuf[cpos] = c; | ||||
729 | if (p != NULL((void *)0)) { | ||||
730 | if (p->implemented == 0) { | ||||
731 | nack(p->name); | ||||
732 | return (LEXERR322); | ||||
733 | } | ||||
734 | state = p->state; | ||||
735 | yylval.s = p->name; | ||||
736 | return (p->token); | ||||
737 | } | ||||
738 | break; | ||||
739 | |||||
740 | case SITECMD7: | ||||
741 | if (cbuf[cpos] == ' ') { | ||||
742 | cpos++; | ||||
743 | return (SP269); | ||||
744 | } | ||||
745 | cp = &cbuf[cpos]; | ||||
746 | if ((cp2 = strpbrk(cp, " \n"))) | ||||
747 | cpos = cp2 - cbuf; | ||||
748 | c = cbuf[cpos]; | ||||
749 | cbuf[cpos] = '\0'; | ||||
750 | upper(cp); | ||||
751 | p = lookup(sitetab, cp); | ||||
752 | cbuf[cpos] = c; | ||||
753 | if (p != NULL((void *)0)) { | ||||
754 | if (p->implemented == 0) { | ||||
755 | state = CMD0; | ||||
756 | nack(p->name); | ||||
757 | return (LEXERR322); | ||||
758 | } | ||||
759 | state = p->state; | ||||
760 | yylval.s = p->name; | ||||
761 | return (p->token); | ||||
762 | } | ||||
763 | state = CMD0; | ||||
764 | break; | ||||
765 | |||||
766 | case OSTR4: | ||||
767 | if (cbuf[cpos] == '\n') { | ||||
768 | state = CMD0; | ||||
769 | return (CRLF270); | ||||
770 | } | ||||
771 | /* FALLTHROUGH */ | ||||
772 | |||||
773 | case STR12: | ||||
774 | case ZSTR15: | ||||
775 | dostr1: | ||||
776 | if (cbuf[cpos] == ' ') { | ||||
777 | cpos++; | ||||
778 | state = state == OSTR4 ? STR23 : state+1; | ||||
779 | return (SP269); | ||||
780 | } | ||||
781 | break; | ||||
782 | |||||
783 | case ZSTR26: | ||||
784 | if (cbuf[cpos] == '\n') { | ||||
785 | state = CMD0; | ||||
786 | return (CRLF270); | ||||
787 | } | ||||
788 | /* FALLTHROUGH */ | ||||
789 | |||||
790 | case STR23: | ||||
791 | cp = &cbuf[cpos]; | ||||
792 | n = strlen(cp); | ||||
793 | cpos += n - 1; | ||||
794 | /* | ||||
795 | * Make sure the string is nonempty and \n terminated. | ||||
796 | */ | ||||
797 | if (n > 1 && cbuf[cpos] == '\n') { | ||||
798 | cbuf[cpos] = '\0'; | ||||
799 | yylval.s = strdup(cp); | ||||
800 | if (yylval.s == NULL((void *)0)) | ||||
801 | fatal("Ran out of memory."); | ||||
802 | cbuf[cpos] = '\n'; | ||||
803 | state = ARGS1; | ||||
804 | return (STRING323); | ||||
805 | } | ||||
806 | break; | ||||
807 | |||||
808 | case NSTR8: | ||||
809 | if (cbuf[cpos] == ' ') { | ||||
810 | cpos++; | ||||
811 | return (SP269); | ||||
812 | } | ||||
813 | if (isdigit((unsigned char)cbuf[cpos])) { | ||||
814 | cp = &cbuf[cpos]; | ||||
815 | while (isdigit((unsigned char)cbuf[++cpos])) | ||||
816 | ; | ||||
817 | c = cbuf[cpos]; | ||||
818 | cbuf[cpos] = '\0'; | ||||
819 | yylval.i = atoi(cp); | ||||
820 | cbuf[cpos] = c; | ||||
821 | state = STR12; | ||||
822 | return (NUMBER324); | ||||
823 | } | ||||
824 | state = STR12; | ||||
825 | goto dostr1; | ||||
826 | |||||
827 | case ARGS1: | ||||
828 | if (isdigit((unsigned char)cbuf[cpos])) { | ||||
829 | long long llval; | ||||
830 | |||||
831 | cp = &cbuf[cpos]; | ||||
832 | errno(*__errno()) = 0; | ||||
833 | llval = strtoll(cp, &cp2, 10); | ||||
834 | if (llval < 0 || | ||||
835 | (errno(*__errno()) == ERANGE34 && llval == LLONG_MAX9223372036854775807LL)) | ||||
836 | break; | ||||
837 | |||||
838 | cpos = (int)(cp2 - cbuf); | ||||
839 | if (llval > INT_MAX2147483647) { | ||||
840 | yylval.o = llval; | ||||
841 | return (BIGNUM325); | ||||
842 | } else { | ||||
843 | yylval.i = (int)llval; | ||||
844 | return (NUMBER324); | ||||
845 | } | ||||
846 | } | ||||
847 | if (strncasecmp(&cbuf[cpos], "ALL", 3) == 0 && | ||||
848 | !isalnum((unsigned char)cbuf[cpos + 3])) { | ||||
849 | cpos += 3; | ||||
850 | return ALL272; | ||||
851 | } | ||||
852 | switch (cbuf[cpos++]) { | ||||
853 | |||||
854 | case '\n': | ||||
855 | state = CMD0; | ||||
856 | return (CRLF270); | ||||
857 | |||||
858 | case ' ': | ||||
859 | return (SP269); | ||||
860 | |||||
861 | case ',': | ||||
862 | return (COMMA271); | ||||
863 | |||||
864 | case 'A': | ||||
865 | case 'a': | ||||
866 | return (A257); | ||||
867 | |||||
868 | case 'B': | ||||
869 | case 'b': | ||||
870 | return (B258); | ||||
871 | |||||
872 | case 'C': | ||||
873 | case 'c': | ||||
874 | return (C259); | ||||
875 | |||||
876 | case 'E': | ||||
877 | case 'e': | ||||
878 | return (E260); | ||||
879 | |||||
880 | case 'F': | ||||
881 | case 'f': | ||||
882 | return (F261); | ||||
883 | |||||
884 | case 'I': | ||||
885 | case 'i': | ||||
886 | return (I262); | ||||
887 | |||||
888 | case 'L': | ||||
889 | case 'l': | ||||
890 | return (L263); | ||||
891 | |||||
892 | case 'N': | ||||
893 | case 'n': | ||||
894 | return (N264); | ||||
895 | |||||
896 | case 'P': | ||||
897 | case 'p': | ||||
898 | return (P265); | ||||
899 | |||||
900 | case 'R': | ||||
901 | case 'r': | ||||
902 | return (R266); | ||||
903 | |||||
904 | case 'S': | ||||
905 | case 's': | ||||
906 | return (S267); | ||||
907 | |||||
908 | case 'T': | ||||
909 | case 't': | ||||
910 | return (T268); | ||||
911 | |||||
912 | } | ||||
913 | break; | ||||
914 | |||||
915 | default: | ||||
916 | fatal("Unknown state in scanner."); | ||||
917 | } | ||||
918 | state = CMD0; | ||||
919 | return (LEXERR322); | ||||
920 | } | ||||
921 | } | ||||
922 | |||||
923 | void | ||||
924 | upper(char *s) | ||||
925 | { | ||||
926 | char *p; | ||||
927 | |||||
928 | for (p = s; *p; p++) | ||||
929 | *p = (char)toupper((unsigned char)*p); | ||||
930 | } | ||||
931 | |||||
932 | static void | ||||
933 | help(struct tab *ctab, char *s) | ||||
934 | { | ||||
935 | struct tab *c; | ||||
936 | int width, NCMDS; | ||||
937 | char *type; | ||||
938 | |||||
939 | if (ctab == sitetab) | ||||
940 | type = "SITE "; | ||||
941 | else | ||||
942 | type = ""; | ||||
943 | width = 0, NCMDS = 0; | ||||
944 | for (c = ctab; c->name != NULL((void *)0); c++) { | ||||
945 | int len = strlen(c->name); | ||||
946 | |||||
947 | if (len > width) | ||||
948 | width = len; | ||||
949 | NCMDS++; | ||||
950 | } | ||||
951 | width = (width + 8) &~ 7; | ||||
952 | if (s == NULL((void *)0)) { | ||||
953 | int i, j, w; | ||||
954 | int columns, lines; | ||||
955 | |||||
956 | lreply(214, "The following %scommands are recognized %s.", | ||||
957 | type, "(* =>'s unimplemented)"); | ||||
958 | columns = 76 / width; | ||||
959 | if (columns == 0) | ||||
960 | columns = 1; | ||||
961 | lines = (NCMDS + columns - 1) / columns; | ||||
962 | for (i = 0; i < lines; i++) { | ||||
963 | printf(" "); | ||||
964 | for (j = 0; j < columns; j++) { | ||||
965 | c = ctab + j * lines + i; | ||||
966 | printf("%s%c", c->name, | ||||
967 | c->implemented ? ' ' : '*'); | ||||
968 | if (c + lines >= &ctab[NCMDS]) | ||||
969 | break; | ||||
970 | w = strlen(c->name) + 1; | ||||
971 | while (w < width) { | ||||
972 | putchar(' ')(!__isthreaded ? __sputc(' ', (&__sF[1])) : (putc)(' ', ( &__sF[1]))); | ||||
973 | w++; | ||||
974 | } | ||||
975 | } | ||||
976 | printf("\r\n"); | ||||
977 | } | ||||
978 | (void) fflush(stdout(&__sF[1])); | ||||
979 | reply(214, "Direct comments to ftp-bugs@%s.", hostname); | ||||
980 | return; | ||||
981 | } | ||||
982 | upper(s); | ||||
983 | c = lookup(ctab, s); | ||||
984 | if (c == NULL((void *)0)) { | ||||
985 | reply(502, "Unknown command %s.", s); | ||||
986 | return; | ||||
987 | } | ||||
988 | if (c->implemented) | ||||
989 | reply(214, "Syntax: %s%s %s", type, c->name, c->help); | ||||
990 | else | ||||
991 | reply(214, "%s%-*s\t%s; unimplemented.", type, width, | ||||
992 | c->name, c->help); | ||||
993 | } | ||||
994 | |||||
995 | static void | ||||
996 | sizecmd(const char *filename) | ||||
997 | { | ||||
998 | switch (type) { | ||||
999 | case TYPE_L4: | ||||
1000 | case TYPE_I3: { | ||||
1001 | struct stat stbuf; | ||||
1002 | if (stat(filename, &stbuf) == -1 || !S_ISREG(stbuf.st_mode)((stbuf.st_mode & 0170000) == 0100000)) | ||||
1003 | reply(550, "%s: not a plain file.", filename); | ||||
1004 | else | ||||
1005 | reply(213, "%lld", (long long)stbuf.st_size); | ||||
1006 | break; } | ||||
1007 | case TYPE_A1: { | ||||
1008 | FILE *fin; | ||||
1009 | int c; | ||||
1010 | off_t count; | ||||
1011 | struct stat stbuf; | ||||
1012 | fin = fopen(filename, "r"); | ||||
1013 | if (fin == NULL((void *)0)) { | ||||
1014 | perror_reply(550, filename); | ||||
1015 | return; | ||||
1016 | } | ||||
1017 | if (fstat(fileno(fin)(!__isthreaded ? ((fin)->_file) : (fileno)(fin)), &stbuf) == -1 || !S_ISREG(stbuf.st_mode)((stbuf.st_mode & 0170000) == 0100000)) { | ||||
1018 | reply(550, "%s: not a plain file.", filename); | ||||
1019 | (void) fclose(fin); | ||||
1020 | return; | ||||
1021 | } | ||||
1022 | if (stbuf.st_size > 10240) { | ||||
1023 | reply(550, "%s: file too large for SIZE.", filename); | ||||
1024 | (void) fclose(fin); | ||||
1025 | return; | ||||
1026 | } | ||||
1027 | |||||
1028 | count = 0; | ||||
1029 | while((c = getc(fin)(!__isthreaded ? (--(fin)->_r < 0 ? __srget(fin) : (int )(*(fin)->_p++)) : (getc)(fin))) != EOF(-1)) { | ||||
1030 | if (c == '\n') /* will get expanded to \r\n */ | ||||
1031 | count++; | ||||
1032 | count++; | ||||
1033 | } | ||||
1034 | (void) fclose(fin); | ||||
1035 | |||||
1036 | reply(213, "%lld", (long long)count); | ||||
1037 | break; } | ||||
1038 | default: | ||||
1039 | reply(504, "SIZE not implemented for Type %c.", "?AEIL"[type]); | ||||
1040 | } | ||||
1041 | } | ||||
1042 | #line 1035 "ftpcmd.c" | ||||
1043 | /* allocate initial stack or double stack size, up to YYMAXDEPTH */ | ||||
1044 | static int yygrowstack(void) | ||||
1045 | { | ||||
1046 | unsigned int newsize; | ||||
1047 | long sslen; | ||||
1048 | short *newss; | ||||
1049 | YYSTYPE *newvs; | ||||
1050 | |||||
1051 | if ((newsize = yystacksize) == 0) | ||||
1052 | newsize = YYINITSTACKSIZE200; | ||||
1053 | else if (newsize >= YYMAXDEPTH10000) | ||||
1054 | return -1; | ||||
1055 | else if ((newsize *= 2) > YYMAXDEPTH10000) | ||||
1056 | newsize = YYMAXDEPTH10000; | ||||
1057 | sslen = yyssp - yyss; | ||||
1058 | #ifdef SIZE_MAX | ||||
1059 | #define YY_SIZE_MAX0xffffffffU SIZE_MAX | ||||
1060 | #else | ||||
1061 | #define YY_SIZE_MAX0xffffffffU 0xffffffffU | ||||
1062 | #endif | ||||
1063 | if (newsize && YY_SIZE_MAX0xffffffffU / newsize < sizeof *newss) | ||||
1064 | goto bail; | ||||
1065 | newss = (short *)realloc(yyss, newsize * sizeof *newss); | ||||
1066 | if (newss == NULL((void *)0)) | ||||
1067 | goto bail; | ||||
1068 | yyss = newss; | ||||
1069 | yyssp = newss + sslen; | ||||
1070 | if (newsize
| ||||
1071 | goto bail; | ||||
1072 | newvs = (YYSTYPE *)realloc(yyvs, newsize * sizeof *newvs); | ||||
1073 | if (newvs == NULL((void *)0)) | ||||
1074 | goto bail; | ||||
1075 | yyvs = newvs; | ||||
1076 | yyvsp = newvs + sslen; | ||||
1077 | yystacksize = newsize; | ||||
1078 | yysslim = yyss + newsize - 1; | ||||
1079 | return 0; | ||||
1080 | bail: | ||||
1081 | if (yyss) | ||||
1082 | free(yyss); | ||||
1083 | if (yyvs) | ||||
1084 | free(yyvs); | ||||
1085 | yyss = yyssp = NULL((void *)0); | ||||
1086 | yyvs = yyvsp = NULL((void *)0); | ||||
1087 | yystacksize = 0; | ||||
1088 | return -1; | ||||
1089 | } | ||||
1090 | |||||
1091 | #define YYABORTgoto yyabort goto yyabort | ||||
1092 | #define YYREJECTgoto yyabort goto yyabort | ||||
1093 | #define YYACCEPTgoto yyaccept goto yyaccept | ||||
1094 | #define YYERRORgoto yyerrlab goto yyerrlab | ||||
1095 | int | ||||
1096 | yyparse(void) | ||||
1097 | { | ||||
1098 | int yym, yyn, yystate; | ||||
1099 | #if YYDEBUG0 | ||||
1100 | const char *yys; | ||||
1101 | |||||
1102 | if ((yys = getenv("YYDEBUG"))) | ||||
1103 | { | ||||
1104 | yyn = *yys; | ||||
1105 | if (yyn >= '0' && yyn <= '9') | ||||
1106 | yydebug = yyn - '0'; | ||||
1107 | } | ||||
1108 | #endif /* YYDEBUG */ | ||||
1109 | |||||
1110 | yynerrs = 0; | ||||
1111 | yyerrflag = 0; | ||||
1112 | yychar = (-1); | ||||
1113 | |||||
1114 | if (yyss == NULL((void *)0) && yygrowstack()) goto yyoverflow; | ||||
| |||||
1115 | yyssp = yyss; | ||||
1116 | yyvsp = yyvs; | ||||
1117 | *yyssp = yystate = 0; | ||||
1118 | |||||
1119 | yyloop: | ||||
1120 | if ((yyn = yydefred[yystate]) != 0) goto yyreduce; | ||||
1121 | if (yychar
| ||||
1122 | { | ||||
1123 | if ((yychar = yylex()) < 0) yychar = 0; | ||||
1124 | #if YYDEBUG0 | ||||
1125 | if (yydebug) | ||||
1126 | { | ||||
1127 | yys = 0; | ||||
1128 | if (yychar <= YYMAXTOKEN325) yys = yyname[yychar]; | ||||
1129 | if (!yys) yys = "illegal-symbol"; | ||||
1130 | printf("%sdebug: state %d, reading %d (%s)\n", | ||||
1131 | YYPREFIX"yy", yystate, yychar, yys); | ||||
1132 | } | ||||
1133 | #endif | ||||
1134 | } | ||||
1135 | if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && | ||||
1136 | yyn <= YYTABLESIZE304 && yycheck[yyn] == yychar) | ||||
1137 | { | ||||
1138 | #if YYDEBUG0 | ||||
1139 | if (yydebug) | ||||
1140 | printf("%sdebug: state %d, shifting to state %d\n", | ||||
1141 | YYPREFIX"yy", yystate, yytable[yyn]); | ||||
1142 | #endif | ||||
1143 | if (yyssp >= yysslim && yygrowstack()) | ||||
1144 | { | ||||
1145 | goto yyoverflow; | ||||
1146 | } | ||||
1147 | *++yyssp = yystate = yytable[yyn]; | ||||
| |||||
1148 | *++yyvsp = yylval; | ||||
1149 | yychar = (-1); | ||||
1150 | if (yyerrflag > 0) --yyerrflag; | ||||
1151 | goto yyloop; | ||||
1152 | } | ||||
1153 | if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && | ||||
1154 | yyn <= YYTABLESIZE304 && yycheck[yyn] == yychar) | ||||
1155 | { | ||||
1156 | yyn = yytable[yyn]; | ||||
1157 | goto yyreduce; | ||||
1158 | } | ||||
1159 | if (yyerrflag) goto yyinrecovery; | ||||
1160 | #if defined(__GNUC__4) | ||||
1161 | goto yynewerror; | ||||
1162 | #endif | ||||
1163 | yynewerror: | ||||
1164 | yyerror("syntax error"); | ||||
1165 | #if defined(__GNUC__4) | ||||
1166 | goto yyerrlab; | ||||
1167 | #endif | ||||
1168 | yyerrlab: | ||||
1169 | ++yynerrs; | ||||
1170 | yyinrecovery: | ||||
1171 | if (yyerrflag < 3) | ||||
1172 | { | ||||
1173 | yyerrflag = 3; | ||||
1174 | for (;;) | ||||
1175 | { | ||||
1176 | if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE256) >= 0 && | ||||
1177 | yyn <= YYTABLESIZE304 && yycheck[yyn] == YYERRCODE256) | ||||
1178 | { | ||||
1179 | #if YYDEBUG0 | ||||
1180 | if (yydebug) | ||||
1181 | printf("%sdebug: state %d, error recovery shifting\ | ||||
1182 | to state %d\n", YYPREFIX"yy", *yyssp, yytable[yyn]); | ||||
1183 | #endif | ||||
1184 | if (yyssp >= yysslim && yygrowstack()) | ||||
1185 | { | ||||
1186 | goto yyoverflow; | ||||
1187 | } | ||||
1188 | *++yyssp = yystate = yytable[yyn]; | ||||
1189 | *++yyvsp = yylval; | ||||
1190 | goto yyloop; | ||||
1191 | } | ||||
1192 | else | ||||
1193 | { | ||||
1194 | #if YYDEBUG0 | ||||
1195 | if (yydebug) | ||||
1196 | printf("%sdebug: error recovery discarding state %d\n", | ||||
1197 | YYPREFIX"yy", *yyssp); | ||||
1198 | #endif | ||||
1199 | if (yyssp <= yyss) goto yyabort; | ||||
1200 | --yyssp; | ||||
1201 | --yyvsp; | ||||
1202 | } | ||||
1203 | } | ||||
1204 | } | ||||
1205 | else | ||||
1206 | { | ||||
1207 | if (yychar == 0) goto yyabort; | ||||
1208 | #if YYDEBUG0 | ||||
1209 | if (yydebug) | ||||
1210 | { | ||||
1211 | yys = 0; | ||||
1212 | if (yychar <= YYMAXTOKEN325) yys = yyname[yychar]; | ||||
1213 | if (!yys) yys = "illegal-symbol"; | ||||
1214 | printf("%sdebug: state %d, error recovery discards token %d (%s)\n", | ||||
1215 | YYPREFIX"yy", yystate, yychar, yys); | ||||
1216 | } | ||||
1217 | #endif | ||||
1218 | yychar = (-1); | ||||
1219 | goto yyloop; | ||||
1220 | } | ||||
1221 | yyreduce: | ||||
1222 | #if YYDEBUG0 | ||||
1223 | if (yydebug) | ||||
1224 | printf("%sdebug: state %d, reducing by rule %d (%s)\n", | ||||
1225 | YYPREFIX"yy", yystate, yyn, yyrule[yyn]); | ||||
1226 | #endif | ||||
1227 | yym = yylen[yyn]; | ||||
1228 | if (yym
| ||||
1229 | yyval = yyvsp[1-yym]; | ||||
1230 | else | ||||
1231 | memset(&yyval, 0, sizeof yyval); | ||||
1232 | switch (yyn) | ||||
1233 | { | ||||
1234 | case 2: | ||||
1235 | #line 141 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1236 | { | ||||
1237 | if (fromname) { | ||||
1238 | free(fromname); | ||||
1239 | fromname = NULL((void *)0); | ||||
1240 | } | ||||
1241 | restart_point = 0; | ||||
1242 | } | ||||
1243 | break; | ||||
1244 | case 4: | ||||
1245 | #line 153 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1246 | { | ||||
1247 | monitor_user(yyvsp[-1].s); | ||||
1248 | free(yyvsp[-1].s); | ||||
1249 | } | ||||
1250 | break; | ||||
1251 | case 5: | ||||
1252 | #line 158 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1253 | { | ||||
1254 | quit = monitor_pass(yyvsp[-1].s); | ||||
1255 | explicit_bzero(yyvsp[-1].s, strlen(yyvsp[-1].s)); | ||||
1256 | free(yyvsp[-1].s); | ||||
1257 | |||||
1258 | /* Terminate unprivileged pre-auth slave */ | ||||
1259 | if (quit) | ||||
1260 | _exit(0); | ||||
1261 | } | ||||
1262 | break; | ||||
1263 | case 6: | ||||
1264 | #line 168 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1265 | { | ||||
1266 | if (yyvsp[-3].i) { | ||||
1267 | if (yyvsp[-1].i) { | ||||
1268 | usedefault = 1; | ||||
1269 | reply(500, | ||||
1270 | "Illegal PORT rejected (range errors)."); | ||||
1271 | } else if (portcheck && | ||||
1272 | ntohs(data_dest.su_sin.sin_port)(__uint16_t)(__builtin_constant_p(data_dest.su_sin.sin_port) ? (__uint16_t)(((__uint16_t)(data_dest.su_sin.sin_port) & 0xffU ) << 8 | ((__uint16_t)(data_dest.su_sin.sin_port) & 0xff00U) >> 8) : __swap16md(data_dest.su_sin.sin_port) ) < IPPORT_RESERVED1024) { | ||||
1273 | usedefault = 1; | ||||
1274 | reply(500, | ||||
1275 | "Illegal PORT rejected (reserved port)."); | ||||
1276 | } else if (portcheck && | ||||
1277 | memcmp(&data_dest.su_sin.sin_addr, | ||||
1278 | &his_addr.su_sin.sin_addr, | ||||
1279 | sizeof data_dest.su_sin.sin_addr)) { | ||||
1280 | usedefault = 1; | ||||
1281 | reply(500, | ||||
1282 | "Illegal PORT rejected (address wrong)."); | ||||
1283 | } else { | ||||
1284 | usedefault = 0; | ||||
1285 | if (pdata >= 0) { | ||||
1286 | (void) close(pdata); | ||||
1287 | pdata = -1; | ||||
1288 | } | ||||
1289 | reply(200, "PORT command successful."); | ||||
1290 | } | ||||
1291 | } | ||||
1292 | } | ||||
1293 | break; | ||||
1294 | case 7: | ||||
1295 | #line 197 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1296 | { | ||||
1297 | if (yyvsp[-3].i) { | ||||
1298 | /* reject invalid host_long_port4 */ | ||||
1299 | if (yyvsp[-1].i) { | ||||
1300 | reply(500, | ||||
1301 | "Illegal LPRT command rejected"); | ||||
1302 | usedefault = 1; | ||||
1303 | } else { | ||||
1304 | usedefault = 0; | ||||
1305 | if (pdata >= 0) { | ||||
1306 | (void) close(pdata); | ||||
1307 | pdata = -1; | ||||
1308 | } | ||||
1309 | reply(200, "LPRT command successful."); | ||||
1310 | } | ||||
1311 | } | ||||
1312 | } | ||||
1313 | break; | ||||
1314 | case 8: | ||||
1315 | #line 216 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1316 | { | ||||
1317 | if (yyvsp[-3].i) { | ||||
1318 | /* reject invalid host_long_port6 */ | ||||
1319 | if (yyvsp[-1].i) { | ||||
1320 | reply(500, | ||||
1321 | "Illegal LPRT command rejected"); | ||||
1322 | usedefault = 1; | ||||
1323 | } else { | ||||
1324 | usedefault = 0; | ||||
1325 | if (pdata >= 0) { | ||||
1326 | (void) close(pdata); | ||||
1327 | pdata = -1; | ||||
1328 | } | ||||
1329 | reply(200, "LPRT command successful."); | ||||
1330 | } | ||||
1331 | } | ||||
1332 | } | ||||
1333 | break; | ||||
1334 | case 9: | ||||
1335 | #line 235 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1336 | { | ||||
1337 | if (yyvsp[-3].i) | ||||
1338 | extended_port(yyvsp[-1].s); | ||||
1339 | free(yyvsp[-1].s); | ||||
1340 | } | ||||
1341 | break; | ||||
1342 | case 10: | ||||
1343 | #line 242 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1344 | { | ||||
1345 | if (yyvsp[-1].i) | ||||
1346 | passive(); | ||||
1347 | } | ||||
1348 | break; | ||||
1349 | case 11: | ||||
1350 | #line 247 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1351 | { | ||||
1352 | if (yyvsp[-1].i) | ||||
1353 | long_passive("LPSV", PF_UNSPEC0); | ||||
1354 | } | ||||
1355 | break; | ||||
1356 | case 12: | ||||
1357 | #line 252 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1358 | { | ||||
1359 | if (yyvsp[-3].i) | ||||
1360 | long_passive("EPSV", epsvproto2af(yyvsp[-1].i)); | ||||
1361 | } | ||||
1362 | break; | ||||
1363 | case 13: | ||||
1364 | #line 257 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1365 | { | ||||
1366 | if (yyvsp[-3].i) { | ||||
1367 | reply(200, "EPSV ALL command successful."); | ||||
1368 | epsvall++; | ||||
1369 | } | ||||
1370 | } | ||||
1371 | break; | ||||
1372 | case 14: | ||||
1373 | #line 264 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1374 | { | ||||
1375 | if (yyvsp[-1].i) | ||||
1376 | long_passive("EPSV", PF_UNSPEC0); | ||||
1377 | } | ||||
1378 | break; | ||||
1379 | case 15: | ||||
1380 | #line 269 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1381 | { | ||||
1382 | if (yyvsp[-3].i) { | ||||
1383 | switch (cmd_type) { | ||||
1384 | |||||
1385 | case TYPE_A1: | ||||
1386 | if (cmd_form == FORM_N1) { | ||||
1387 | reply(200, "Type set to A."); | ||||
1388 | type = cmd_type; | ||||
1389 | form = cmd_form; | ||||
1390 | } else | ||||
1391 | reply(504, "Form must be N."); | ||||
1392 | break; | ||||
1393 | |||||
1394 | case TYPE_E2: | ||||
1395 | reply(504, "Type E not implemented."); | ||||
1396 | break; | ||||
1397 | |||||
1398 | case TYPE_I3: | ||||
1399 | reply(200, "Type set to I."); | ||||
1400 | type = cmd_type; | ||||
1401 | break; | ||||
1402 | |||||
1403 | case TYPE_L4: | ||||
1404 | if (cmd_bytesz == 8) { | ||||
1405 | reply(200, | ||||
1406 | "Type set to L (byte size 8)."); | ||||
1407 | type = cmd_type; | ||||
1408 | } else | ||||
1409 | reply(504, "Byte size must be 8."); | ||||
1410 | |||||
1411 | } | ||||
1412 | } | ||||
1413 | } | ||||
1414 | break; | ||||
1415 | case 16: | ||||
1416 | #line 303 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1417 | { | ||||
1418 | if (yyvsp[-3].i) { | ||||
1419 | switch (yyvsp[-1].i) { | ||||
1420 | |||||
1421 | case STRU_F1: | ||||
1422 | reply(200, "STRU F ok."); | ||||
1423 | break; | ||||
1424 | |||||
1425 | default: | ||||
1426 | reply(504, "Unimplemented STRU type."); | ||||
1427 | } | ||||
1428 | } | ||||
1429 | } | ||||
1430 | break; | ||||
1431 | case 17: | ||||
1432 | #line 317 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1433 | { | ||||
1434 | if (yyvsp[-3].i) { | ||||
1435 | switch (yyvsp[-1].i) { | ||||
1436 | |||||
1437 | case MODE_S1: | ||||
1438 | reply(200, "MODE S ok."); | ||||
1439 | break; | ||||
1440 | |||||
1441 | default: | ||||
1442 | reply(502, "Unimplemented MODE type."); | ||||
1443 | } | ||||
1444 | } | ||||
1445 | } | ||||
1446 | break; | ||||
1447 | case 18: | ||||
1448 | #line 331 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1449 | { | ||||
1450 | if (yyvsp[-3].i) { | ||||
1451 | reply(202, "ALLO command ignored."); | ||||
1452 | } | ||||
1453 | } | ||||
1454 | break; | ||||
1455 | case 19: | ||||
1456 | #line 337 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1457 | { | ||||
1458 | if (yyvsp[-7].i) { | ||||
1459 | reply(202, "ALLO command ignored."); | ||||
1460 | } | ||||
1461 | } | ||||
1462 | break; | ||||
1463 | case 20: | ||||
1464 | #line 343 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1465 | { | ||||
1466 | if (yyvsp[-3].i && yyvsp[-1].s != NULL((void *)0)) | ||||
1467 | retrieve(RET_FILE, yyvsp[-1].s); | ||||
1468 | if (yyvsp[-1].s != NULL((void *)0)) | ||||
1469 | free(yyvsp[-1].s); | ||||
1470 | } | ||||
1471 | break; | ||||
1472 | case 21: | ||||
1473 | #line 350 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1474 | { | ||||
1475 | if (yyvsp[-3].i && yyvsp[-1].s != NULL((void *)0)) | ||||
1476 | store(yyvsp[-1].s, "w", 0); | ||||
1477 | if (yyvsp[-1].s != NULL((void *)0)) | ||||
1478 | free(yyvsp[-1].s); | ||||
1479 | } | ||||
1480 | break; | ||||
1481 | case 22: | ||||
1482 | #line 357 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1483 | { | ||||
1484 | if (yyvsp[-3].i && yyvsp[-1].s != NULL((void *)0)) | ||||
1485 | store(yyvsp[-1].s, "a", 0); | ||||
1486 | if (yyvsp[-1].s != NULL((void *)0)) | ||||
1487 | free(yyvsp[-1].s); | ||||
1488 | } | ||||
1489 | break; | ||||
1490 | case 23: | ||||
1491 | #line 364 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1492 | { | ||||
1493 | if (yyvsp[-1].i) | ||||
1494 | send_file_list("."); | ||||
1495 | } | ||||
1496 | break; | ||||
1497 | case 24: | ||||
1498 | #line 369 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1499 | { | ||||
1500 | if (yyvsp[-3].i && yyvsp[-1].s != NULL((void *)0)) | ||||
1501 | send_file_list(yyvsp[-1].s); | ||||
1502 | free(yyvsp[-1].s); | ||||
1503 | } | ||||
1504 | break; | ||||
1505 | case 25: | ||||
1506 | #line 375 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1507 | { | ||||
1508 | if (yyvsp[-1].i) | ||||
1509 | retrieve(RET_LIST, "."); | ||||
1510 | } | ||||
1511 | break; | ||||
1512 | case 26: | ||||
1513 | #line 380 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1514 | { | ||||
1515 | if (yyvsp[-3].i && yyvsp[-1].s != NULL((void *)0)) | ||||
1516 | retrieve(RET_LIST, yyvsp[-1].s); | ||||
1517 | if (yyvsp[-1].s != NULL((void *)0)) | ||||
1518 | free(yyvsp[-1].s); | ||||
1519 | } | ||||
1520 | break; | ||||
1521 | case 27: | ||||
1522 | #line 387 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1523 | { | ||||
1524 | if (yyvsp[-3].i && yyvsp[-1].s != NULL((void *)0)) | ||||
1525 | statfilecmd(yyvsp[-1].s); | ||||
1526 | if (yyvsp[-1].s != NULL((void *)0)) | ||||
1527 | free(yyvsp[-1].s); | ||||
1528 | } | ||||
1529 | break; | ||||
1530 | case 28: | ||||
1531 | #line 394 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1532 | { | ||||
1533 | if (yyvsp[-1].i) | ||||
1534 | statcmd(); | ||||
1535 | } | ||||
1536 | break; | ||||
1537 | case 29: | ||||
1538 | #line 399 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1539 | { | ||||
1540 | if (yyvsp[-3].i && yyvsp[-1].s != NULL((void *)0)) | ||||
1541 | delete(yyvsp[-1].s); | ||||
1542 | if (yyvsp[-1].s != NULL((void *)0)) | ||||
1543 | free(yyvsp[-1].s); | ||||
1544 | } | ||||
1545 | break; | ||||
1546 | case 30: | ||||
1547 | #line 406 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1548 | { | ||||
1549 | if (yyvsp[-3].i && yyvsp[-1].s != NULL((void *)0)) { | ||||
1550 | if (fromname) { | ||||
1551 | renamecmd(fromname, yyvsp[-1].s); | ||||
1552 | free(fromname); | ||||
1553 | fromname = NULL((void *)0); | ||||
1554 | } else { | ||||
1555 | reply(503, | ||||
1556 | "Bad sequence of commands."); | ||||
1557 | } | ||||
1558 | } | ||||
1559 | if (yyvsp[-1].s != NULL((void *)0)) | ||||
1560 | free(yyvsp[-1].s); | ||||
1561 | } | ||||
1562 | break; | ||||
1563 | case 31: | ||||
1564 | #line 421 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1565 | { | ||||
1566 | if (yyvsp[-1].i) | ||||
1567 | reply(225, "ABOR command successful."); | ||||
1568 | } | ||||
1569 | break; | ||||
1570 | case 32: | ||||
1571 | #line 426 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1572 | { | ||||
1573 | if (yyvsp[-1].i) | ||||
1574 | cwd(pw->pw_dir); | ||||
1575 | } | ||||
1576 | break; | ||||
1577 | case 33: | ||||
1578 | #line 431 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1579 | { | ||||
1580 | if (yyvsp[-3].i && yyvsp[-1].s != NULL((void *)0)) | ||||
1581 | cwd(yyvsp[-1].s); | ||||
1582 | if (yyvsp[-1].s != NULL((void *)0)) | ||||
1583 | free(yyvsp[-1].s); | ||||
1584 | } | ||||
1585 | break; | ||||
1586 | case 34: | ||||
1587 | #line 438 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1588 | { | ||||
1589 | help(cmdtab, NULL((void *)0)); | ||||
1590 | } | ||||
1591 | break; | ||||
1592 | case 35: | ||||
1593 | #line 442 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1594 | { | ||||
1595 | char *cp = yyvsp[-1].s; | ||||
1596 | |||||
1597 | if (strncasecmp(cp, "SITE", 4) == 0) { | ||||
1598 | cp = yyvsp[-1].s + 4; | ||||
1599 | if (*cp == ' ') | ||||
1600 | cp++; | ||||
1601 | if (*cp) | ||||
1602 | help(sitetab, cp); | ||||
1603 | else | ||||
1604 | help(sitetab, NULL((void *)0)); | ||||
1605 | } else | ||||
1606 | help(cmdtab, yyvsp[-1].s); | ||||
1607 | free (yyvsp[-1].s); | ||||
1608 | } | ||||
1609 | break; | ||||
1610 | case 36: | ||||
1611 | #line 458 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1612 | { | ||||
1613 | reply(200, "NOOP command successful."); | ||||
1614 | } | ||||
1615 | break; | ||||
1616 | case 37: | ||||
1617 | #line 462 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1618 | { | ||||
1619 | if (yyvsp[-3].i && yyvsp[-1].s != NULL((void *)0)) | ||||
1620 | makedir(yyvsp[-1].s); | ||||
1621 | if (yyvsp[-1].s != NULL((void *)0)) | ||||
1622 | free(yyvsp[-1].s); | ||||
1623 | } | ||||
1624 | break; | ||||
1625 | case 38: | ||||
1626 | #line 469 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1627 | { | ||||
1628 | if (yyvsp[-3].i && yyvsp[-1].s != NULL((void *)0)) | ||||
1629 | removedir(yyvsp[-1].s); | ||||
1630 | if (yyvsp[-1].s != NULL((void *)0)) | ||||
1631 | free(yyvsp[-1].s); | ||||
1632 | } | ||||
1633 | break; | ||||
1634 | case 39: | ||||
1635 | #line 476 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1636 | { | ||||
1637 | if (yyvsp[-1].i) | ||||
1638 | pwd(); | ||||
1639 | } | ||||
1640 | break; | ||||
1641 | case 40: | ||||
1642 | #line 481 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1643 | { | ||||
1644 | if (yyvsp[-1].i) | ||||
1645 | cwd(".."); | ||||
1646 | } | ||||
1647 | break; | ||||
1648 | case 41: | ||||
1649 | #line 486 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1650 | { | ||||
1651 | help(sitetab, NULL((void *)0)); | ||||
1652 | } | ||||
1653 | break; | ||||
1654 | case 42: | ||||
1655 | #line 490 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1656 | { | ||||
1657 | help(sitetab, yyvsp[-1].s); | ||||
1658 | free (yyvsp[-1].s); | ||||
1659 | } | ||||
1660 | break; | ||||
1661 | case 43: | ||||
1662 | #line 495 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1663 | { | ||||
1664 | mode_t oldmask; | ||||
1665 | |||||
1666 | if (yyvsp[-1].i) { | ||||
1667 | oldmask = umask(0); | ||||
1668 | (void) umask(oldmask); | ||||
1669 | reply(200, "Current UMASK is %03o", oldmask); | ||||
1670 | } | ||||
1671 | } | ||||
1672 | break; | ||||
1673 | case 44: | ||||
1674 | #line 505 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1675 | { | ||||
1676 | mode_t oldmask; | ||||
1677 | |||||
1678 | if (yyvsp[-3].i) { | ||||
1679 | if ((yyvsp[-1].i == -1) || (yyvsp[-1].i > 0777)) { | ||||
1680 | reply(501, "Bad UMASK value"); | ||||
1681 | } else if (!umaskchange) { | ||||
1682 | reply(550, | ||||
1683 | "No permission to change umask."); | ||||
1684 | } else { | ||||
1685 | oldmask = umask(yyvsp[-1].i); | ||||
1686 | reply(200, | ||||
1687 | "UMASK set to %03o (was %03o)", | ||||
1688 | yyvsp[-1].i, oldmask); | ||||
1689 | } | ||||
1690 | } | ||||
1691 | } | ||||
1692 | break; | ||||
1693 | case 45: | ||||
1694 | #line 523 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1695 | { | ||||
1696 | if (yyvsp[-5].i && (yyvsp[-1].s != NULL((void *)0))) { | ||||
1697 | if ((yyvsp[-3].i == -1) || (yyvsp[-3].i > 0777)) | ||||
1698 | reply(501, | ||||
1699 | "CHMOD: Mode value must be between " | ||||
1700 | "0 and 0777"); | ||||
1701 | else if (!umaskchange) | ||||
1702 | reply(550, | ||||
1703 | "No permission to change mode of %s.", | ||||
1704 | yyvsp[-1].s); | ||||
1705 | else if (chmod(yyvsp[-1].s, yyvsp[-3].i) == -1) | ||||
1706 | perror_reply(550, yyvsp[-1].s); | ||||
1707 | else | ||||
1708 | reply(200, | ||||
1709 | "CHMOD command successful."); | ||||
1710 | } | ||||
1711 | if (yyvsp[-1].s != NULL((void *)0)) | ||||
1712 | free(yyvsp[-1].s); | ||||
1713 | } | ||||
1714 | break; | ||||
1715 | case 46: | ||||
1716 | #line 543 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1717 | { | ||||
1718 | if (yyvsp[-2].i) | ||||
1719 | reply(200, | ||||
1720 | "Current IDLE time limit is %d " | ||||
1721 | "seconds; max %d", | ||||
1722 | timeout, maxtimeout); | ||||
1723 | } | ||||
1724 | break; | ||||
1725 | case 47: | ||||
1726 | #line 551 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1727 | { | ||||
1728 | if (yyvsp[-4].i) { | ||||
1729 | if (yyvsp[-1].i < 30 || yyvsp[-1].i > maxtimeout) { | ||||
1730 | reply(501, | ||||
1731 | "Maximum IDLE time must be between " | ||||
1732 | "30 and %d seconds", | ||||
1733 | maxtimeout); | ||||
1734 | } else { | ||||
1735 | timeout = yyvsp[-1].i; | ||||
1736 | (void) alarm((unsigned) timeout); | ||||
1737 | reply(200, | ||||
1738 | "Maximum IDLE time set to %d seconds", | ||||
1739 | timeout); | ||||
1740 | } | ||||
1741 | } | ||||
1742 | } | ||||
1743 | break; | ||||
1744 | case 48: | ||||
1745 | #line 568 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1746 | { | ||||
1747 | if (yyvsp[-3].i && yyvsp[-1].s != NULL((void *)0)) | ||||
1748 | store(yyvsp[-1].s, "w", 1); | ||||
1749 | if (yyvsp[-1].s != NULL((void *)0)) | ||||
1750 | free(yyvsp[-1].s); | ||||
1751 | } | ||||
1752 | break; | ||||
1753 | case 49: | ||||
1754 | #line 575 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1755 | { | ||||
1756 | if (yyvsp[-1].i) | ||||
1757 | reply(215, "UNIX Type: L8"); | ||||
1758 | } | ||||
1759 | break; | ||||
1760 | case 50: | ||||
1761 | #line 588 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1762 | { | ||||
1763 | if (yyvsp[-3].i && yyvsp[-1].s != NULL((void *)0)) | ||||
1764 | sizecmd(yyvsp[-1].s); | ||||
1765 | if (yyvsp[-1].s != NULL((void *)0)) | ||||
1766 | free(yyvsp[-1].s); | ||||
1767 | } | ||||
1768 | break; | ||||
1769 | case 51: | ||||
1770 | #line 605 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1771 | { | ||||
1772 | if (yyvsp[-3].i && yyvsp[-1].s != NULL((void *)0)) { | ||||
1773 | struct stat stbuf; | ||||
1774 | if (stat(yyvsp[-1].s, &stbuf) == -1) | ||||
1775 | reply(550, "%s: %s", | ||||
1776 | yyvsp[-1].s, strerror(errno(*__errno()))); | ||||
1777 | else if (!S_ISREG(stbuf.st_mode)((stbuf.st_mode & 0170000) == 0100000)) { | ||||
1778 | reply(550, "%s: not a plain file.", yyvsp[-1].s); | ||||
1779 | } else { | ||||
1780 | struct tm *t; | ||||
1781 | t = gmtime(&stbuf.st_mtimest_mtim.tv_sec); | ||||
1782 | reply(213, | ||||
1783 | "%04d%02d%02d%02d%02d%02d", | ||||
1784 | 1900 + t->tm_year, | ||||
1785 | t->tm_mon+1, t->tm_mday, | ||||
1786 | t->tm_hour, t->tm_min, t->tm_sec); | ||||
1787 | } | ||||
1788 | } | ||||
1789 | if (yyvsp[-1].s != NULL((void *)0)) | ||||
1790 | free(yyvsp[-1].s); | ||||
1791 | } | ||||
1792 | break; | ||||
1793 | case 52: | ||||
1794 | #line 627 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1795 | { | ||||
1796 | reply(221, "Goodbye."); | ||||
1797 | dologout(0); | ||||
1798 | } | ||||
1799 | break; | ||||
1800 | case 53: | ||||
1801 | #line 632 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1802 | { | ||||
1803 | yyclearin(yychar=(-1)); /* discard lookahead data */ | ||||
1804 | yyerrok(yyerrflag=0); /* clear error condition */ | ||||
1805 | state = 0; /* reset lexer state */ | ||||
1806 | } | ||||
1807 | break; | ||||
1808 | case 54: | ||||
1809 | #line 640 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1810 | { | ||||
1811 | restart_point = 0; | ||||
1812 | if (yyvsp[-3].i && yyvsp[-1].s) { | ||||
1813 | if (fromname) | ||||
1814 | free(fromname); | ||||
1815 | fromname = renamefrom(yyvsp[-1].s); | ||||
1816 | if (fromname == NULL((void *)0)) | ||||
1817 | free(yyvsp[-1].s); | ||||
1818 | } else if (yyvsp[-1].s) { | ||||
1819 | free (yyvsp[-1].s); | ||||
1820 | } | ||||
1821 | } | ||||
1822 | break; | ||||
1823 | case 55: | ||||
1824 | #line 654 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1825 | { | ||||
1826 | if (yyvsp[-3].i) { | ||||
1827 | if (fromname) { | ||||
1828 | free(fromname); | ||||
1829 | fromname = NULL((void *)0); | ||||
1830 | } | ||||
1831 | restart_point = yyvsp[-1].o; | ||||
1832 | reply(350, "Restarting at %lld. %s", | ||||
1833 | (long long)restart_point, | ||||
1834 | "Send STORE or RETRIEVE to initiate transfer."); | ||||
1835 | } | ||||
1836 | } | ||||
1837 | break; | ||||
1838 | case 57: | ||||
1839 | #line 674 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1840 | { | ||||
1841 | yyval.s = calloc(1, sizeof(char)); | ||||
1842 | } | ||||
1843 | break; | ||||
1844 | case 60: | ||||
1845 | #line 686 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1846 | { | ||||
1847 | yyval.o = yyvsp[0].i; | ||||
1848 | } | ||||
1849 | break; | ||||
1850 | case 61: | ||||
1851 | #line 690 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1852 | { | ||||
1853 | yyval.o = yyvsp[0].o; | ||||
1854 | } | ||||
1855 | break; | ||||
1856 | case 62: | ||||
1857 | #line 698 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1858 | { | ||||
1859 | char *a, *p; | ||||
1860 | |||||
1861 | if (yyvsp[-10].i < 0 || yyvsp[-10].i > 255 || yyvsp[-8].i < 0 || yyvsp[-8].i > 255 || | ||||
1862 | yyvsp[-6].i < 0 || yyvsp[-6].i > 255 || yyvsp[-4].i < 0 || yyvsp[-4].i > 255 || | ||||
1863 | yyvsp[-2].i < 0 || yyvsp[-2].i > 255 || yyvsp[0].i < 0 || yyvsp[0].i > 255) { | ||||
1864 | yyval.i = 1; | ||||
1865 | } else { | ||||
1866 | data_dest.su_sin.sin_len = sizeof(struct sockaddr_in); | ||||
1867 | data_dest.su_sin.sin_family = AF_INET2; | ||||
1868 | p = (char *)&data_dest.su_sin.sin_port; | ||||
1869 | p[0] = yyvsp[-2].i; p[1] = yyvsp[0].i; | ||||
1870 | a = (char *)&data_dest.su_sin.sin_addr; | ||||
1871 | a[0] = yyvsp[-10].i; a[1] = yyvsp[-8].i; a[2] = yyvsp[-6].i; a[3] = yyvsp[-4].i; | ||||
1872 | yyval.i = 0; | ||||
1873 | } | ||||
1874 | } | ||||
1875 | break; | ||||
1876 | case 63: | ||||
1877 | #line 721 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1878 | { | ||||
1879 | char *a, *p; | ||||
1880 | |||||
1881 | /* reject invalid LPRT command */ | ||||
1882 | if (yyvsp[-16].i != 4 || yyvsp[-14].i != 4 || | ||||
1883 | yyvsp[-12].i < 0 || yyvsp[-12].i > 255 || yyvsp[-10].i < 0 || yyvsp[-10].i > 255 || | ||||
1884 | yyvsp[-8].i < 0 || yyvsp[-8].i > 255 || yyvsp[-6].i < 0 || yyvsp[-6].i > 255 || | ||||
1885 | yyvsp[-4].i != 2 || | ||||
1886 | yyvsp[-2].i < 0 || yyvsp[-2].i > 255 || yyvsp[0].i < 0 || yyvsp[0].i > 255) { | ||||
1887 | yyval.i = 1; | ||||
1888 | } else { | ||||
1889 | data_dest.su_sin.sin_len = | ||||
1890 | sizeof(struct sockaddr_in); | ||||
1891 | data_dest.su_familysu_si.si_family = AF_INET2; | ||||
1892 | p = (char *)&data_dest.su_portsu_si.si_port; | ||||
1893 | p[0] = yyvsp[-2].i; p[1] = yyvsp[0].i; | ||||
1894 | a = (char *)&data_dest.su_sin.sin_addr; | ||||
1895 | a[0] = yyvsp[-12].i; a[1] = yyvsp[-10].i; a[2] = yyvsp[-8].i; a[3] = yyvsp[-6].i; | ||||
1896 | yyval.i = 0; | ||||
1897 | } | ||||
1898 | } | ||||
1899 | break; | ||||
1900 | case 64: | ||||
1901 | #line 751 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1902 | { | ||||
1903 | char *a, *p; | ||||
1904 | |||||
1905 | /* reject invalid LPRT command */ | ||||
1906 | if (yyvsp[-40].i != 6 || yyvsp[-38].i != 16 || | ||||
1907 | yyvsp[-36].i < 0 || yyvsp[-36].i > 255 || yyvsp[-34].i < 0 || yyvsp[-34].i > 255 || | ||||
1908 | yyvsp[-32].i < 0 || yyvsp[-32].i > 255 || yyvsp[-30].i < 0 || yyvsp[-30].i > 255 || | ||||
1909 | yyvsp[-28].i < 0 || yyvsp[-28].i > 255 || yyvsp[-26].i < 0 || yyvsp[-26].i > 255 || | ||||
1910 | yyvsp[-24].i < 0 || yyvsp[-24].i > 255 || yyvsp[-22].i < 0 || yyvsp[-22].i > 255 || | ||||
1911 | yyvsp[-20].i < 0 || yyvsp[-20].i > 255 || yyvsp[-18].i < 0 || yyvsp[-18].i > 255 || | ||||
1912 | yyvsp[-16].i < 0 || yyvsp[-16].i > 255 || yyvsp[-14].i < 0 || yyvsp[-14].i > 255 || | ||||
1913 | yyvsp[-12].i < 0 || yyvsp[-12].i > 255 || yyvsp[-10].i < 0 || yyvsp[-10].i > 255 || | ||||
1914 | yyvsp[-8].i < 0 || yyvsp[-8].i > 255 || yyvsp[-6].i < 0 || yyvsp[-6].i > 255 || | ||||
1915 | yyvsp[-4].i != 2 || | ||||
1916 | yyvsp[-2].i < 0 || yyvsp[-2].i > 255 || yyvsp[0].i < 0 || yyvsp[0].i > 255) { | ||||
1917 | yyval.i = 1; | ||||
1918 | } else { | ||||
1919 | data_dest.su_sin6.sin6_len = | ||||
1920 | sizeof(struct sockaddr_in6); | ||||
1921 | data_dest.su_familysu_si.si_family = AF_INET624; | ||||
1922 | p = (char *)&data_dest.su_portsu_si.si_port; | ||||
1923 | p[0] = yyvsp[-2].i; p[1] = yyvsp[0].i; | ||||
1924 | a = (char *)&data_dest.su_sin6.sin6_addr; | ||||
1925 | a[0] = yyvsp[-36].i; a[1] = yyvsp[-34].i; | ||||
1926 | a[2] = yyvsp[-32].i; a[3] = yyvsp[-30].i; | ||||
1927 | a[4] = yyvsp[-28].i; a[5] = yyvsp[-26].i; | ||||
1928 | a[6] = yyvsp[-24].i; a[7] = yyvsp[-22].i; | ||||
1929 | a[8] = yyvsp[-20].i; a[9] = yyvsp[-18].i; | ||||
1930 | a[10] = yyvsp[-16].i; a[11] = yyvsp[-14].i; | ||||
1931 | a[12] = yyvsp[-12].i; a[13] = yyvsp[-10].i; | ||||
1932 | a[14] = yyvsp[-8].i; a[15] = yyvsp[-6].i; | ||||
1933 | if (his_addr.su_familysu_si.si_family == AF_INET624) { | ||||
1934 | /* XXX more sanity checks! */ | ||||
1935 | data_dest.su_sin6.sin6_scope_id = | ||||
1936 | his_addr.su_sin6.sin6_scope_id; | ||||
1937 | } | ||||
1938 | |||||
1939 | yyval.i = 0; | ||||
1940 | } | ||||
1941 | } | ||||
1942 | break; | ||||
1943 | case 65: | ||||
1944 | #line 795 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1945 | { | ||||
1946 | yyval.i = FORM_N1; | ||||
1947 | } | ||||
1948 | break; | ||||
1949 | case 66: | ||||
1950 | #line 799 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1951 | { | ||||
1952 | yyval.i = FORM_T2; | ||||
1953 | } | ||||
1954 | break; | ||||
1955 | case 67: | ||||
1956 | #line 803 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1957 | { | ||||
1958 | yyval.i = FORM_C3; | ||||
1959 | } | ||||
1960 | break; | ||||
1961 | case 68: | ||||
1962 | #line 810 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1963 | { | ||||
1964 | cmd_type = TYPE_A1; | ||||
1965 | cmd_form = FORM_N1; | ||||
1966 | } | ||||
1967 | break; | ||||
1968 | case 69: | ||||
1969 | #line 815 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1970 | { | ||||
1971 | cmd_type = TYPE_A1; | ||||
1972 | cmd_form = yyvsp[0].i; | ||||
1973 | } | ||||
1974 | break; | ||||
1975 | case 70: | ||||
1976 | #line 820 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1977 | { | ||||
1978 | cmd_type = TYPE_E2; | ||||
1979 | cmd_form = FORM_N1; | ||||
1980 | } | ||||
1981 | break; | ||||
1982 | case 71: | ||||
1983 | #line 825 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1984 | { | ||||
1985 | cmd_type = TYPE_E2; | ||||
1986 | cmd_form = yyvsp[0].i; | ||||
1987 | } | ||||
1988 | break; | ||||
1989 | case 72: | ||||
1990 | #line 830 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1991 | { | ||||
1992 | cmd_type = TYPE_I3; | ||||
1993 | } | ||||
1994 | break; | ||||
1995 | case 73: | ||||
1996 | #line 834 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
1997 | { | ||||
1998 | cmd_type = TYPE_L4; | ||||
1999 | cmd_bytesz = 8; | ||||
2000 | } | ||||
2001 | break; | ||||
2002 | case 74: | ||||
2003 | #line 839 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
2004 | { | ||||
2005 | cmd_type = TYPE_L4; | ||||
2006 | cmd_bytesz = yyvsp[0].i; | ||||
2007 | } | ||||
2008 | break; | ||||
2009 | case 75: | ||||
2010 | #line 845 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
2011 | { | ||||
2012 | cmd_type = TYPE_L4; | ||||
2013 | cmd_bytesz = yyvsp[0].i; | ||||
2014 | } | ||||
2015 | break; | ||||
2016 | case 76: | ||||
2017 | #line 853 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
2018 | { | ||||
2019 | yyval.i = STRU_F1; | ||||
2020 | } | ||||
2021 | break; | ||||
2022 | case 77: | ||||
2023 | #line 857 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
2024 | { | ||||
2025 | yyval.i = STRU_R2; | ||||
2026 | } | ||||
2027 | break; | ||||
2028 | case 78: | ||||
2029 | #line 861 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
2030 | { | ||||
2031 | yyval.i = STRU_P3; | ||||
2032 | } | ||||
2033 | break; | ||||
2034 | case 79: | ||||
2035 | #line 868 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
2036 | { | ||||
2037 | yyval.i = MODE_S1; | ||||
2038 | } | ||||
2039 | break; | ||||
2040 | case 80: | ||||
2041 | #line 872 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
2042 | { | ||||
2043 | yyval.i = MODE_B2; | ||||
2044 | } | ||||
2045 | break; | ||||
2046 | case 81: | ||||
2047 | #line 876 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
2048 | { | ||||
2049 | yyval.i = MODE_C3; | ||||
2050 | } | ||||
2051 | break; | ||||
2052 | case 82: | ||||
2053 | #line 883 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
2054 | { | ||||
2055 | /* | ||||
2056 | * Problem: this production is used for all pathname | ||||
2057 | * processing, but only gives a 550 error reply. | ||||
2058 | * This is a valid reply in some cases but not in others. | ||||
2059 | */ | ||||
2060 | if (logged_in && yyvsp[0].s && strchr(yyvsp[0].s, '~') != NULL((void *)0)) { | ||||
2061 | glob_t gl; | ||||
2062 | int flags = | ||||
2063 | GLOB_BRACE0x0080|GLOB_NOCHECK0x0010|GLOB_QUOTE0x0400|GLOB_TILDE0x0800; | ||||
2064 | char *pptr = yyvsp[0].s; | ||||
2065 | |||||
2066 | /* | ||||
2067 | * glob() will only find a leading ~, but | ||||
2068 | * Netscape kindly puts a slash in front of | ||||
2069 | * it for publish URLs. There needs to be | ||||
2070 | * a flag for glob() that expands tildes | ||||
2071 | * anywhere in the string. | ||||
2072 | */ | ||||
2073 | if ((pptr[0] == '/') && (pptr[1] == '~')) | ||||
2074 | pptr++; | ||||
2075 | |||||
2076 | memset(&gl, 0, sizeof(gl)); | ||||
2077 | if (glob(pptr, flags, NULL((void *)0), &gl) || | ||||
2078 | gl.gl_pathc == 0) { | ||||
2079 | reply(550, "not found"); | ||||
2080 | yyval.s = NULL((void *)0); | ||||
2081 | } else { | ||||
2082 | yyval.s = strdup(gl.gl_pathv[0]); | ||||
2083 | } | ||||
2084 | globfree(&gl); | ||||
2085 | free(yyvsp[0].s); | ||||
2086 | } else | ||||
2087 | yyval.s = yyvsp[0].s; | ||||
2088 | } | ||||
2089 | break; | ||||
2090 | case 84: | ||||
2091 | #line 926 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
2092 | { | ||||
2093 | int ret, dec, multby, digit; | ||||
2094 | |||||
2095 | /* | ||||
2096 | * Convert a number that was read as decimal number | ||||
2097 | * to what it would be if it had been read as octal. | ||||
2098 | */ | ||||
2099 | dec = yyvsp[0].i; | ||||
2100 | multby = 1; | ||||
2101 | ret = 0; | ||||
2102 | while (dec) { | ||||
2103 | digit = dec%10; | ||||
2104 | if (digit > 7) { | ||||
2105 | ret = -1; | ||||
2106 | break; | ||||
2107 | } | ||||
2108 | ret += digit * multby; | ||||
2109 | multby *= 8; | ||||
2110 | dec /= 10; | ||||
2111 | } | ||||
2112 | yyval.i = ret; | ||||
2113 | } | ||||
2114 | break; | ||||
2115 | case 85: | ||||
2116 | #line 953 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
2117 | { | ||||
2118 | if (logged_in) | ||||
2119 | yyval.i = 1; | ||||
2120 | else { | ||||
2121 | reply(530, "Please login with USER and PASS."); | ||||
2122 | yyval.i = 0; | ||||
2123 | state = 0; | ||||
2124 | YYABORTgoto yyabort; | ||||
2125 | } | ||||
2126 | } | ||||
2127 | break; | ||||
2128 | case 86: | ||||
2129 | #line 967 "/usr/src/libexec/ftpd/ftpcmd.y" | ||||
2130 | { | ||||
2131 | if (!logged_in) { | ||||
2132 | reply(530, "Please login with USER and PASS."); | ||||
2133 | yyval.i = 0; | ||||
2134 | state = 0; | ||||
2135 | YYABORTgoto yyabort; | ||||
2136 | } else if (epsvall) { | ||||
2137 | reply(501, "the command is disallowed " | ||||
2138 | "after EPSV ALL"); | ||||
2139 | usedefault = 1; | ||||
2140 | yyval.i = 0; | ||||
2141 | } else | ||||
2142 | yyval.i = 1; | ||||
2143 | } | ||||
2144 | break; | ||||
2145 | #line 2138 "ftpcmd.c" | ||||
2146 | } | ||||
2147 | yyssp -= yym; | ||||
2148 | yystate = *yyssp; | ||||
2149 | yyvsp -= yym; | ||||
2150 | yym = yylhs[yyn]; | ||||
2151 | if (yystate
| ||||
2152 | { | ||||
2153 | #if YYDEBUG0 | ||||
2154 | if (yydebug) | ||||
2155 | printf("%sdebug: after reduction, shifting from state 0 to\ | ||||
2156 | state %d\n", YYPREFIX"yy", YYFINAL1); | ||||
2157 | #endif | ||||
2158 | yystate = YYFINAL1; | ||||
2159 | *++yyssp = YYFINAL1; | ||||
2160 | *++yyvsp = yyval; | ||||
2161 | if (yychar
| ||||
2162 | { | ||||
2163 | if ((yychar = yylex()) < 0) yychar = 0; | ||||
2164 | #if YYDEBUG0 | ||||
2165 | if (yydebug) | ||||
2166 | { | ||||
2167 | yys = 0; | ||||
2168 | if (yychar <= YYMAXTOKEN325) yys = yyname[yychar]; | ||||
2169 | if (!yys) yys = "illegal-symbol"; | ||||
2170 | printf("%sdebug: state %d, reading %d (%s)\n", | ||||
2171 | YYPREFIX"yy", YYFINAL1, yychar, yys); | ||||
2172 | } | ||||
2173 | #endif | ||||
2174 | } | ||||
2175 | if (yychar == 0) goto yyaccept; | ||||
2176 | goto yyloop; | ||||
2177 | } | ||||
2178 | if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && | ||||
2179 | yyn <= YYTABLESIZE304 && yycheck[yyn] == yystate) | ||||
2180 | yystate = yytable[yyn]; | ||||
2181 | else | ||||
2182 | yystate = yydgoto[yym]; | ||||
2183 | #if YYDEBUG0 | ||||
2184 | if (yydebug) | ||||
2185 | printf("%sdebug: after reduction, shifting from state %d \ | ||||
2186 | to state %d\n", YYPREFIX"yy", *yyssp, yystate); | ||||
2187 | #endif | ||||
2188 | if (yyssp >= yysslim && yygrowstack()) | ||||
2189 | { | ||||
2190 | goto yyoverflow; | ||||
2191 | } | ||||
2192 | *++yyssp = yystate; | ||||
2193 | *++yyvsp = yyval; | ||||
2194 | goto yyloop; | ||||
2195 | yyoverflow: | ||||
2196 | yyerror("yacc stack overflow"); | ||||
2197 | yyabort: | ||||
2198 | if (yyss) | ||||
2199 | free(yyss); | ||||
2200 | if (yyvs) | ||||
2201 | free(yyvs); | ||||
2202 | yyss = yyssp = NULL((void *)0); | ||||
2203 | yyvs = yyvsp = NULL((void *)0); | ||||
2204 | yystacksize = 0; | ||||
2205 | return (1); | ||||
2206 | yyaccept: | ||||
2207 | if (yyss) | ||||
2208 | free(yyss); | ||||
2209 | if (yyvs) | ||||
2210 | free(yyvs); | ||||
2211 | yyss = yyssp = NULL((void *)0); | ||||
2212 | yyvs = yyvsp = NULL((void *)0); | ||||
2213 | yystacksize = 0; | ||||
2214 | return (0); | ||||
2215 | } |